javascript或json表达式来解析json以获得某个值

javascript or json expression to parse json to get a certain value

本文关键字:json 表达式 javascript      更新时间:2023-09-26

我需要能够解析这个json数组/对象,以查找元素与值匹配的值。例如,我想得到$的值,其中@name=nameGreen。

{
      "startNode": {
        "result": {
          "node1": {
            "$": "A_Value"
          },
          "attribute-value": [
            {
              "@name": "nameRed",
              "$": "attribute1"
            },
            {
              "@name": "nameBlue",
              "$": "attribute2"
            },
            {
              "@name": "nameGreen",
              "$": "attribute3"
            },
            {
              "@name": "nameYellow",
              "$": "attribute4"
            }
          ]
        }
      }
    }

获取node1的值很容易console.log(['startNode'].result.node1['$']);将获取A_value的值。

我只是在写逻辑方面有问题,1.当@name=nameGreen时,2.然后获得$的值

注意:这个json节点是动态的,所以@name和$值总是会改变。

真的很感谢你的帮助。

您需要循环遍历实际值来检查它们。例如,

var attrs = ['startNode'].result.['attribute-value']
for (var i = 0; i < attrs.length; i++) {
  if (attrs[i]['@name'] == 'nameGreen') ...
} 

(显然,你可以写一些更好的代码来做到这一点。)

我建议您寻找一些库来帮助您以更好的方式提取这些数据,因为它看起来像是在解析XML。

JSBin示例

这里有一种方法,通过数组的"属性值"循环:

var a = d.startNode.result["attribute-value"];
for (var i = 0; i < a.length; i++) {
  if (a[i]['@name'] === 'nameRed') {
    console.log(a[i].$);
  }
}

需要注意的事项:

  • 如果变量中有"-",请尝试使用括号表示法,而不是点表示法。

  • @ 等奇数字符相同

  • 然而,当使用$时,这不是必需的,正如您从上面的代码中看到的那样

所需的通用功能(ES6)

const getThing = (arr, key, test, match) => (
  arr.filter(el => (el[key] === test))[0][match]
);
var arr = obj.startNode.result['attribute-value'];
var out = getThing(arr, '@name', 'nameGreen', '$');

演示

或者在更详细的ES5:中也是如此

function getThing(arr, key, test, match) {
  return arr.filter(function (el) {
    return el[key] === test;
  })[0][match];
};

演示

在ES6中,您还可以使用数组对象的find方法或其polyfill来定位"属性值"对象,然后再读取其$属性:

var nodes = { ..... }; // the posted object.
var findObj = ( arrayOfObj, propName, propVal) => 
    arrayOfObj.find( (obj) => obj[ propName] === propVal );
var atr = findObj( nodes.startNode.result["attribute-value"], "@name", "nameGreen");
console.log( atr ? "$ for namegreen: " + atr.$ : "not found")

其中,findObj是用于在arrayOfObj中搜索具有值为propVal的属性propName的对象的函数,并且提供给find的箭头函数返回用于匹配的truefalse