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

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

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

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

退房: 是否有JSON的查询语言?

从那个线程:

JaQL ( Wiki )

JsonPath 。

Json查询

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

使用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) 

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

JSON.parse(source,reviver)

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

可选的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"}" 

参考

  • ECMAScript Wiki:JSON支持

  • MDN:JSON.parse示例

  • MDN:JSON.stringify toJSON行为

  • MSDN:toJSON方法

  • 歌剧:JSON.parse

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

你可以使用jQuery $.grep(array,filterfn)方法过滤数组

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

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