根据部分路径的动态键映射获取 json 值
Get json value based on dynamic key mapping for partial path
我正在尝试获取 json 文件中某个键的值,但有几个问题需要解决。
JSON 的密钥是动态的 - 我有另一个 JSON,其中我得到了 JSON 中密钥的路径。
例如,我有一个包含以下映射的 json 文件:
{
“地址路径”:“personal.addresses”
}
这告诉我,我正在寻找的值在另一个名为 personal 的密钥中。
JSON 将如下所示:
{
"username": "X1",
"id":"1X",
"type": "patron",
"group": "students",
"personal": {
"lastname": "lname",
"firstname": "fname",
"email": "test@test.test",
"phone": "1-111-111-1111",
"mobilePhone": "(111)111-1111",
"birthDate": "1979-01-23T00:00:00.000+0000",
"addresses":
{
"countryId": "US",
"addressLine1": "1111 Brannon Ford Suite 111",
"city": "Kettering",
"region": "MA",
"postalCode": "11111-1111",
"primaryAddress": true
}
}
}
例如,如果 JSON 是“用户”,我想要得到的是用户。personal.addresses
如何将“user.personal.addresses”翻译成“users.+dynamic”?
我试过这样做,但它似乎不适用于我从映射 json 文件中提取的任何类型的字符串。
我有一个问题,因为我不知道我得到的位置是单个值还是值数组。
例如,JSON 可能如下所示:
{
"用户名": "X1",
"id":"1X",
“类型”:“赞助人”,
“组”:“学生”,
“个人的”: {
"姓氏": "lname",
“名字”:“名字”,
"email": "test@test.test",
"phone": "1-111-111-1111",
"手机": "(111)111-1111",
“出生日期”:“1979-01-23T00:00:00.000+0000”,
“地址”:[
{
"countryId": "美国",
"addressLine1": "1111 Brannon Ford Suite 111",
“城市”:“凯特林”,
“区域”:“MA”,
"邮编": "11111-1111",
“主要地址”:真实
}, {
"countryId": "美国",
"addressLine1": "1112 Brannon Ford Suite 112",
“城市”:“凯特林”,
“区域”:“IL”,
"邮编": "11112-1112",
“主要地址”:假
}
]
}
}
也就是说我需要确定我要获取的数据的结构,是不是数组。
我可以通过检查结果是字符串还是对象来做到这一点吗?我知道 JSON 文件中的数组在节点 js 中被读取为对象。
你想要那样的东西
用三个例子
let object = {
"group": "students",
"personal": {
"addresses": {
"countryId": "US",
}
}
}
let test1 = checkObject(object, "personal.addresses")
console.log(test1);
let object2 = {
"test": {
"test_deep": [
{
"countryId": "US",
"addressLine1": "1111 Brannon Ford Suite 111"
},
{
"countryId": "US",
"addressLine1": "1112 Brannon Ford Suite 112",
}
]
}
}
let test2 = checkObject(object2, "test.test_deep")
console.log(test2);
let object3 = {
"test": {
"test_deep": "test"
}
}
let test3 = checkObject(object3, "test.test_deep")
console.log(test3);
function checkObject(object, addressesPath) {
let addres = addressesPath.split(".")
let item = object
for (let index = 0; index < addres.length; index++) {
if (typeof item[addres[index]] != 'undefined') {
item = item[addres[index]]
} else {
item = null
break
}
}
return {
type: typeof item,
is_array: Array.isArray(item),
data: item
}
}
我正在尝试获取 json 文件中某个键的值,但有几个问题需要解决。
JSON 的密钥是动态的 - 我有另一个 JSON,其中我得到了 JSON 中密钥的路径。 例如,我有一个包含以下映射的 json 文件:
{ “地址路径”:“personal.addresses” }
这告诉我,我正在寻找的值在另一个名为 personal 的密钥中。 JSON 将如下所示:
{
"username": "X1",
"id":"1X",
"type": "patron",
"group": "students",
"personal": {
"lastname": "lname",
"firstname": "fname",
"email": "test@test.test",
"phone": "1-111-111-1111",
"mobilePhone": "(111)111-1111",
"birthDate": "1979-01-23T00:00:00.000+0000",
"addresses":
{
"countryId": "US",
"addressLine1": "1111 Brannon Ford Suite 111",
"city": "Kettering",
"region": "MA",
"postalCode": "11111-1111",
"primaryAddress": true
}
}
}
例如,如果 JSON 是“用户”,我想要得到的是用户。personal.addresses
如何将“user.personal.addresses”翻译成“users.+dynamic”? 我试过这样做,但它似乎不适用于我从映射 json 文件中提取的任何类型的字符串。
我有一个问题,因为我不知道我得到的位置是单个值还是值数组。 例如,JSON 可能如下所示:
{ "用户名": "X1", "id":"1X", “类型”:“赞助人”, “组”:“学生”, “个人的”: { "姓氏": "lname", “名字”:“名字”, "email": "test@test.test", "phone": "1-111-111-1111", "手机": "(111)111-1111", “出生日期”:“1979-01-23T00:00:00.000+0000”, “地址”:[ { "countryId": "美国", "addressLine1": "1111 Brannon Ford Suite 111", “城市”:“凯特林”, “区域”:“MA”, "邮编": "11111-1111", “主要地址”:真实 }, { "countryId": "美国", "addressLine1": "1112 Brannon Ford Suite 112", “城市”:“凯特林”, “区域”:“IL”, "邮编": "11112-1112", “主要地址”:假 } ] } }
也就是说我需要确定我要获取的数据的结构,是不是数组。 我可以通过检查结果是字符串还是对象来做到这一点吗?我知道 JSON 文件中的数组在节点 js 中被读取为对象。
你想要那样的东西 用三个例子
let object = {
"group": "students",
"personal": {
"addresses": {
"countryId": "US",
}
}
}
let test1 = checkObject(object, "personal.addresses")
console.log(test1);
let object2 = {
"test": {
"test_deep": [
{
"countryId": "US",
"addressLine1": "1111 Brannon Ford Suite 111"
},
{
"countryId": "US",
"addressLine1": "1112 Brannon Ford Suite 112",
}
]
}
}
let test2 = checkObject(object2, "test.test_deep")
console.log(test2);
let object3 = {
"test": {
"test_deep": "test"
}
}
let test3 = checkObject(object3, "test.test_deep")
console.log(test3);
function checkObject(object, addressesPath) {
let addres = addressesPath.split(".")
let item = object
for (let index = 0; index < addres.length; index++) {
if (typeof item[addres[index]] != 'undefined') {
item = item[addres[index]]
} else {
item = null
break
}
}
return {
type: typeof item,
is_array: Array.isArray(item),
data: item
}
}