根据部分路径的动态键映射获取 json 值

Get json value based on dynamic key mapping for partial path

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

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

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