根据部分路径的动态键映射获取json值
Posted
技术标签:
【中文标题】根据部分路径的动态键映射获取json值【英文标题】:Get json value based on dynamic key mapping for partial path 【发布时间】:2021-03-03 14:35:59 【问题描述】:我正在尝试获取 json 文件中某个键的值,但有几个问题需要解决。
JSON 的键是动态的 - 我有另一个 JSON,在其中我得到了 JSON 中键的路径。 例如,我有一个包含以下映射的 json 文件:
"addressesPath":"personal.addresses"
这告诉我,我正在寻找的值在另一个键中,称为个人。 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 是“用户”,我想要得到的是 user.personal.addresses
如何将“user.personal.addresses”翻译成“users.+dynamic”? 我尝试这样做,但它似乎不适用于我从映射 json 文件中提取的任何类型的字符串。
我有一个问题,因为我不知道我得到的位置是单个值还是值数组。 例如,JSON 可能如下所示:
"用户名": "X1", "id":"1X", “类型”:“赞助人”, “组”:“学生”, “个人的”: "姓氏": "lname", “名字”:“名字”, "电子邮件": "test@test.test", “电话”:“1-111-111-1111”, "手机": "(111)111-1111", "birthDate": "1979-01-23T00:00:00.000+0000", “地址”:[ "countryId": "美国", "addressLine1": "1111 布兰农福特套房 111", “城市”:“凯特琳”, “地区”:“MA”, "邮编": "11111-1111", “主要地址”:真 , "countryId": "美国", "addressLine1": "1112 布兰农福特套房 112", “城市”:“凯特琳”, “地区”:“IL”, "邮政编码": "11112-1112", “主地址”:假 ]
这意味着我需要确定我要获取的数据的结构,无论它是否是一个数组。 我可以通过检查结果是字符串还是对象来做到这一点吗?我知道 JSON 文件中的数组被读取为节点 js 中的对象。
【问题讨论】:
如何从 json 中检索值?你使用 JSON.parse 吗? @RadicalEdward 我使用我构建的函数返回元素,就好像它已被解析一样,是的。它不是一个字符串。我可以使用常规结构获取值,例如“users.personal”。我只是有一个问题,因为我需要的路径是动态的,所以我不能只在代码中写“users.personal”。它可以是“users.personal”,但也可以是“users.info.personal”或“users.personalinfo”。我只能通过从映射 json 文件中获取值来知道路径(映射本身保存为字符串变量)。 然后按照简单的事情。users['user']['personal']['address']
将接受 [..]
中的变量,您也可以传递变量,例如 address
personal
等。下面的答案会有所帮助。
@RadicalEdward 有趣。我尝试了 users.[addressMap] 但不断收到错误消息。我会尝试这种方式,看看它是否有效。 Mohammad 还给了我一个函数来解决我必须处理的另一个问题,但现在我想看看这个系统是否有效,因为它可能对未来有用。
还要提到addresssMap的错误和值。
【参考方案1】:
你想要这样的东西 举三个例子
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值的主要内容,如果未能解决你的问题,请参考以下文章
nsfetchedresultscontroller 中部分名称键路径的 Nil 关系值