根据部分路径的动态键映射获取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值的主要内容,如果未能解决你的问题,请参考以下文章

D3.js的基础部分之数组的处理 映射(v3版本)

nsfetchedresultscontroller 中部分名称键路径的 Nil 关系值

Bigquery:是不是有一种 json 路径方法可以仅从具有动态键的 json 数组中提取值?

使用未知键序列化 JSON

Js 怎么遍历json对象所有key及根据动态key获取值

通过键值映射需要 NodeJS JSON 响应