如何在JavaScript中解析或查询复杂的JSON

时间:2011-09-06 21:30:05

标签: javascript jquery json parsing traversal

是否可以对JSON对象执行复杂查询?我对JavaScript或jQuery解决方案持开放态度越大越好。我正在设想一种类似于LINQ或SQL的函数式编程语言。

我不喜欢其他第三方库或附加组件。

更新
从早期答案的外观来看,一个附加组件将是必要的。在这种情况下,我更喜欢一个不需要安装过程的附加组件。使用软件发布(如jQuery)部署的东西很好(例如* .js文件集)。

4 个答案:

答案 0 :(得分:3)

当你与它交互时,它不是一个“JSON对象”,它是一个JavaScript对象。 (“JSON对象”仅存在于数据表示法中。)JavaScript本身没有任何高级函数编程结构,因此您需要第三方库来完成此类事情。 JavaScript几乎只有属性访问器,“这个对象是否具有此名称的属性?”的运算符。 (inhasOwnProperty),以及第5版(尚未得到广泛支持),一些方便的特定于阵列的功能,如forEachevery,{{3} },map等。

答案 1 :(得分:3)

答案 2 :(得分:1)

使用JSON.stringifyreplacer回调来实现此目的:

function replacer(match, offset, fullstring)
  {
  return replacer.str;
  }

replacer.str = "\u0022filterValues\u0022:[\u0022hi\u0022,\u0022bye\u0022]"; /* Use DOM node value */

var foo = JSON.stringify({
"Region": {
    "filterField": "kw_Region",
    "filterValues": [
        "aa",
        "bb"
    ]
},
"ApplicationName": {
    "filterField": "kw_ApplicationName",
    "filterValues": [
        "aa",
        "bb"
    ]
},
"IssueType": {
    "filterField": "kw_IssueType",
    "filterValues": [
        "aa",
        "bb"
    ]
},
"Outage": {
    "filterField": "kw_Outage",
    "filterValues": [
        "aa",
        "bb"
    ]
},
"Priority": {
    "filterField": "kw_Priority",
    "filterValues": [
        "aa",
        "bb"
    ]
}
}).replace(/"filterValues[^\]]+./g, replacer)

以下是有关序列化和转换的两种JSON方法的一些文档,stringifyparse

JSON.parse(来源,复活)

  

此方法解析JSON文本以生成对象或数组。它可以抛出一个SyntaxError异常。

     

可选的reviver参数是一个可以过滤和转换结果的函数。它接收每个键和值,并使用其返回值代替原始值。如果它返回它收到的内容,则不修改结构。如果它返回undefined,则删除该成员。

     

最终使用空字符串和最高值调用reviver,以允许转换最顶层的值。一定要正确处理这种情况,通常是返回提供的值,否则JSON.parse将返回undefined。

 if (k === "") return v

JSON.stringify(值,替换者,空格)

  

stringify方法从JavaScript值生成JSON文本。如果value是对象或数组,则将递归访问该结构以确定每个元素或元素的序列化。结构不得是周期性的。

     

当找到对象值时,如果对象包含toJSON方法,则将调用其toJSON方法并将结果进行字符串化。 toJSON方法没有序列化:它返回应该序列化的名称/值对表示的值,如果没有任何序列化,则返回undefined。 toJSON方法将传递与该值相关联的键,并且这将绑定到持有该键的对象。

     

您可以提供可选的替换方法。它将传递每个成员的键和值,并将其绑定到包含对象。从您的方法返回的值将被序列化。如果您的方法返回undefined,则该成员将从序列化中排除。

     

如果replacer参数是一个数组,那么它将用于选择要序列化的成员。它会过滤结果,以便只有具有在replacer数组中列出的键的成员才会被字符串化。

     

不具有JSON表示的值(例如未定义或函数)将不会被序列化。对象中的这些值将被删除;在数组中,它们将被替换为null。您可以使用replacer函数替换具有JSON值的函数。 JSON.stringify(undefined)返回undefined。

     

可选的space参数生成一个值的字符串化,该值用换行符和缩进填充,以便于阅读。

     

如果space参数是非空字符串,则该字符串将用于缩进。如果space参数是一个数字,那么缩进将是那么多空格。

var alias = {"Clark":"","phone":""};

function kryptonite(key)
   {
   var replacement = {};
   for(var cursor in this)
     {
     if(cursor in alias)
       replacement[cursor] = this[cursor]
     }

   return replacement;
   }

var contact = {
               "Clark":"Kent",
               "Kal El":"Superman",
               "phone":"555-7777"
              }

contact.toJSON = kryptonite;
var foo = JSON.stringify(contact) // "{"Clark":"Kent","phone":"555-7777"}"

<强>参考

答案 3 :(得分:0)

嗯...... YQL就是这样做的,但那将是第三方。

您可以使用jQuery $.grep(array,filterfn)方法

过滤数组
 var newArr = $.grep(oldArr,function(elInArray,index){
   return elInArray.key === somevalue;
 });

如果您愿意,您当然可以在那里使用正则表达式,或者使用更复杂的条件,例如检查多个键,键内的键,键内的数组等。