【问题标题】:Parsing a dynamic JSON object解析动态 JSON 对象
【发布时间】:2019-04-24 18:00:57
【问题描述】:

我正在解析 JSON 并在该 JSON 对象中搜索特定键。问题是JSON的结构不断变化,我无法硬编码路径,有没有更好的解析方法?

我可以把它转换成下面的常规 JSON 键值对

{
"resourceName": "Bundle",
"id": "6d6e-81d5-5a1e2b452563",
"lastUpdated": "2069-06-21",
"url": "http://abcd.com",
.
.
.
... so on 
}

我尝试过使用硬编码方法,但这似乎并不总是有效

这里是 JSON 的片段

{
    "resourceName": "Bundle",
    "id": "6d6e-81d5-5a1e2b452563",
    "meta": {
        "lastUpdated": "2069-06-21"
    },
    "data1": [{
        "url": "http://abcd.com",
        "value": {
            "url": "http://abcd.com",
            "value": [{
                "url": "Severity",
                "value": "info"
            }, {
                "url": "dfew",
                "value": "fefdd"
            }, {
                "url": "fwef",
                "value": "This is data blah blah"
            }]
        }
    }]
}

【问题讨论】:

  • 如果我理解正确,您想遍历整个结构并提取值为字符串的键值对。多个urlvalue 键呢?
  • 如果它不断变化,但你知道潜在的选择,你可能会考虑实施optional chaining
  • @p.s.w.g 有多个的时候,我需要拿第一个

标签: javascript arrays json reactjs parsing


【解决方案1】:

你递归地搜索对象:

function get_lastUpdated(obj)
{
  for ( var key in obj )
  {
    if ( key == "lastUpdated" ) return obj[key];
    if ( typeof obj[key] == "object" )
    {
      var res = get_lastUpdated(obj[key]);
      if ( res ) return res;
    }
  }
  return null;
}

对于一个简单的情况,类似上面的方法可以工作。

【讨论】:

    【解决方案2】:

    当您调用JSON.parse 时,您可以传入一个名为reviver 的回调函数,该函数将递归地应用于所有键值对。例如:

    var jsonString = `{
        "resourceName": "Bundle",
        "id": "6d6e-81d5-5a1e2b452563",
        "meta": {
            "lastUpdated": "2069-06-21"
        },
        "data1": [{
            "url": "http://abcd.com",
            "value": {
                "url": "http://abcd.com",
                "value": [{
                    "url": "Severity",
                    "value": "info"
                }, {
                    "url": "dfew",
                    "value": "fefdd"
                }, {
                    "url": "fwef",
                    "value": "This is data blah blah"
                }]
            }
        }]
    }`;
    
    var obj = {};
    JSON.parse(jsonString, (key, value) => {
      if (typeof value === "string" && !(key in obj)) {
        obj[key] = value;
      }
    });
    
    console.log(obj);

    如果已经解析了对象,您可以使用类似的策略与JSON.stringifyreplacer 回调:

    var data = {
        "resourceName": "Bundle",
        "id": "6d6e-81d5-5a1e2b452563",
        "meta": {
            "lastUpdated": "2069-06-21"
        },
        "data1": [{
            "url": "http://abcd.com",
            "value": {
                "url": "http://abcd.com",
                "value": [{
                    "url": "Severity",
                    "value": "info"
                }, {
                    "url": "dfew",
                    "value": "fefdd"
                }, {
                    "url": "fwef",
                    "value": "This is data blah blah"
                }]
            }
        }]
    };
    
    var obj = {};
    JSON.stringify(data, (key, value) => {
      if (typeof value === "string" && !(key in obj)) {
        obj[key] = value;
      }
      return value;
    });
    
    console.log(obj);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-25
      • 1970-01-01
      • 1970-01-01
      • 2021-04-08
      • 1970-01-01
      相关资源
      最近更新 更多