假设我有一个相当复杂的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")可以使用JSONPath $.address[0].streetAddress提取。
理想情况下,我想要这样的东西:calculateJSONPath(3) -其中3是从顶部开始的第三个键,这个函数将返回$.address[0].streetAddress。我不认为会有这样的事情,但我必须从某个地方开始,如果不是从零开始。
编辑:示例用例:用户将一个JSON文件加载到我的应用程序中。我允许他们使用我的界面选择特定的键。想象一下每个键旁边的复选框。接下来,用户可以上传第二个JSON文件,并查看前面选择的键/值是否存在于第二个JSON中。
编辑2:搜索不能工作,因为我希望用户选择的键/值与第一个JSON位于同一个层次结构中。如果用户在第一个JSON文件中选择"1 a": "1 b",那么第二个JSON文件必须在相同的嵌套层次结构中具有相同的键/值。
发布于 2017-02-05 15:32:41
下面是我说过的话(选中复选框以了解我的观点):
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>
发布于 2017-02-05 16:21:39
下面将从提供的JSON创建DOM结构。这是非常基本的,它只是一个概念的证明。
您将需要从这个基础构建应用程序的其余部分。
每个级别(UL)都有一个索引,每个项目(LI)都有一个键。
//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()<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>
发布于 2020-11-20 15:35:32
https://stackoverflow.com/questions/42053438
复制相似问题