首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算JSONPath

计算JSONPath
EN

Stack Overflow用户
提问于 2017-02-05 14:52:11
回答 3查看 590关注 0票数 2

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

代码语言:javascript
复制
{
  "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")可以使用JSONPath $.address[0].streetAddress提取。

理想情况下,我想要这样的东西:calculateJSONPath(3) -其中3是从顶部开始的第三个键,这个函数将返回$.address[0].streetAddress。我不认为会有这样的事情,但我必须从某个地方开始,如果不是从零开始。

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-02-05 15:32:41

下面是我说过的话(选中复选框以了解我的观点):

代码语言:javascript
复制
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"));
}
代码语言:javascript
复制
div {
  padding: 5px;
  padding-left: 25px;
}

span {
  border-bottom: 1px solid black;
  border-left: 1px solid black;
}
代码语言:javascript
复制
<div id="preview">
  <span><input type="checkbox" data-path="$"/>$</span>
</div>

票数 2
EN

Stack Overflow用户

发布于 2017-02-05 16:21:39

下面将从提供的JSON创建DOM结构。这是非常基本的,它只是一个概念的证明。

您将需要从这个基础构建应用程序的其余部分。

每个级别(UL)都有一个索引,每个项目(LI)都有一个键。

代码语言:javascript
复制
//rework JSON into a structure
function buildDOMFromJSON()
{
  var JSONString = document.querySelector("#uploadedJSON1").value;
  
  //you need to add a gazillion error checks
  var JSONcompiled = JSON.parse(JSONString);

  //test if array or object
  var start, isObject;
  if (JSONcompiled instanceof Array)
  {
      start = JSONcompiled;
      isObject = false;
  }
  else //is object
  {
     start = Object.keys(JSONcompiled); //create an array to start
     isObject = JSONcompiled;
  }
  
  loopJSONLevel(start, isObject, document.querySelector("#JSONstructure1 > ul"));
}

function loopJSONLevel(obj, isObject, level)
{
  //loop the array
  obj.forEach(function(element, index){
    var objectToEvaluate;
    if (isObject == false)
    {
      objectToEvaluate = element; 
    }
    else
    {
      objectToEvaluate = isObject[element];
    }

    //create a new level
    var newLevel = document.createElement("li");
    var newLevel2 = document.createElement("ul");
    if (objectToEvaluate instanceof Array)
    {
      //create a new level
      if (element instanceof Array)
      {
          newLevel2.setAttribute("data-path", index);
      }
      else
      {
          newLevel2.setAttribute("data-path", element);
      }      
      level.appendChild(newLevel2);
      loopJSONLevel(objectToEvaluate, false, newLevel2);
    }
    else if (Object.prototype.toString.call(objectToEvaluate) == "[object Object]")
    {
      //create a new level
      if (element instanceof Array)
      {
          newLevel2.setAttribute("data-path", index);
      }
      else
      {
          newLevel2.setAttribute("data-path", element);
      }
      newLevel2.setAttribute("data-path", index);
      level.appendChild(newLevel2);
      loopJSONLevel(Object.keys(objectToEvaluate), objectToEvaluate, newLevel2);
    }
    else
    {
      //draw the value
      level.appendChild(newLevel);
      newLevel.textContent = objectToEvaluate;
      newLevel.setAttribute("data-path", element);
    }
    
    
  });
}
buildDOMFromJSON()
代码语言:javascript
复制
<textarea id="uploadedJSON1">
  [{
  "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"
  }]
}]
  </textarea>

<div id="JSONstructure1">
  <ul>

  </ul>
  </div>

票数 1
EN

Stack Overflow用户

发布于 2020-11-20 15:35:32

我也用角度做过同样的事情。

您可以在下面看到一个示例:

https://davicvictor.github.io/jsonpath-ui/并打开您的控制台。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42053438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档