【问题标题】:Get json value based on dynamic key mapping for partial path根据部分路径的动态键映射获取json值
【发布时间】:2021-03-03 14:35:59
【问题描述】:

我正在尝试获取 json 文件中某个键的值,但有几个问题需要解决。

  1. 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 文件中提取的任何类型的字符串。

  1. 我有一个问题,因为我不知道我得到的位置是单个值还是值数组。 例如,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的错误和值。

标签: node.js arrays json key-value


【解决方案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
  }
}

【讨论】:

  • 哇哦,效果很好!我需要确切地研究它是如何工作的,但我只是在自己的代码中对其进行了测试,它返回的正是我想要的!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-30
  • 1970-01-01
  • 2016-04-21
  • 1970-01-01
  • 2021-06-17
  • 1970-01-01
  • 2013-07-31
相关资源
最近更新 更多