javascript - 计算 JSONPath

标签 javascript json jsonpath

假设我有一个相当复杂的 JSON 对象,如下所示:

{
  "firstName": "John",
  "address": [{
    "streetAddress": "1 street",
    "special": {
      "1 a": "1 b"
    }
  }, {
    "streetAddress": "2 naist street",
    "special": {
      "2 a": "2 b"
    }
  }],
  "phoneNumbers": [{
    "type": "iPhone",
    "number": "0123-4567-8888"
  }]
}

是否有任何工具/库可以计算特定键/值对的 JSONPath

例如:可以使用 JSONPath streetAddress": "1 street" 提取第三行数据 ( $.address[0].streetAddress ) 的 JSONPath 。

理想情况下,我想要这样的东西: calculateJSONPath(3) - 其中 3 是从顶部开始的第三个键,此函数将返回 $.address[0].streetAddress 。我不认为会有什么东西能完全做到这一点,但我必须从某个地方开始,即使不是从头开始。

编辑:示例用例: 用户将 JSON 文件加载到我的应用程序中。我允许他们使用我的界面选择特定的键。想象一下每个键旁边的复选框。接下来,用户可以上传第二个 JSON 文件,并查看之前选择的键/值是否存在于第二个 JSON 中。

编辑 2: 搜索不起作用,因为我希望用户选择的键/值位于与第一个 JSON 相同的层次结构中。例如:如果用户在第一个 JSON 文件中选择 "1 a": "1 b",则第二个 JSON 文件必须在同一嵌套层次结构中具有相同的键/值。

最佳答案

以下是我所说的内容(选中复选框以了解我的观点):

var $ = {
  "firstName": "John",
  "address": [{
    "streetAddress": "1 street",
    "special": {
      "2 a": "2 a"
    }
  }, {
    "streetAddress": "2 naist street",
    "special": {
      "2 a": "2 a"
    }
  }],
  "phoneNumbers": [{
    "type": "iPhone",
    "number": "0123-4567-8888"
  }]
};


// the recursive function that create the structure
function createStructure(container, obj, path) {
  for(var key in obj) {
    var d = cd(key, path);
    if(typeof obj[key] == "object")
      createStructure(d, obj[key], path + "['" + key + "']");
    container.appendChild(d);
  }
}

// of course we call the function ...
createStructure(document.getElementById("preview"), $, "$");


// create a preview element (unimportant)
function cd(prop, path) {
  var d = document.createElement("div");
  var s = document.createElement("span");

  var i = document.createElement("input");
  i.setAttribute("data-path", path + "['" + prop +"']");
  i.onclick = check;
  i.type = "checkbox";
  s.appendChild(i);
 
  s.appendChild(document.createTextNode(prop));
  d.appendChild(s);
  return d;
}

// the event handler (unimportant)
function check(e) {
  if(e.target.checked)
    alert(e.target.getAttribute("data-path"));
}
div {
  padding: 5px;
  padding-left: 25px;
}

span {
  border-bottom: 1px solid black;
  border-left: 1px solid black;
}
<div id="preview">
  <span><input type="checkbox" data-path="$"/>$</span>
</div>

关于javascript - 计算 JSONPath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42053438/

相关文章:

java - 如何使用 Jackson 递归地修改 JsonNode 的值

jsonpath - 在 Spring Boot 测试中将 JSON 中的对象与 jsonpath 匹配

javascript - 如何从 slider 的 DOM 中获取元素

javascript - 需要 Selenium IDE 中逗号分隔值的数字

javascript - 单击文档中任意位置时清除超时

java - 使用 Jackson 的 TypeResolverBuilder 反序列化原始长字段

c# - Javascript DATE 和 C# date - 什么是最好的解决方案?

asp.net - 为什么ASP.NET JSON Web服务在 'd'中返回结果?

python - 读取 json 数据的函数和返回元组或列表的 json 路径

javascript - 如何在启动 Mocha 测试用例之前添加延迟?