【问题标题】:How to parse or query complex JSON in JavaScript如何在 JavaScript 中解析或查询复杂的 JSON
【发布时间】:2011-09-06 21:30:04
【问题描述】:

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

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

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

【问题讨论】:

标签: javascript jquery json parsing traversal


【解决方案1】:

【讨论】:

  • 没有完成任务的标准。这就是我需要知道的。
【解决方案2】:

当您与之交互时,它已经不是“JSON 对象”了,而是一个 JavaScript 对象。 (“JSON 对象”仅以数据表示法的形式存在。)JavaScript 本身没有任何高级函数式编程结构,因此您需要第三方库来处理这类事情。 JavaScript 几乎只有属性访问器,即“此对象是否具有具有此名称的属性?”的运算符。 (inhasOwnProperty)以及从第 5 版开始(尚未得到广泛支持),一些方便的特定于数组的功能,如forEacheverymapfilter 等。

【讨论】:

    【解决方案3】:

    使用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(source, reviver)

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

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

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

     if (k === "") return v
    

    JSON.stringify(值、替换器、空格)

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

    当找到一个对象值时,如果该对象包含一个toJSON方法,就会调用它的toJSON方法,并将结果字符串化。 toJSON 方法不序列化:它返回由应该序列化的名称/值对表示的值,如果不应该序列化,则返回 undefined。 toJSON 方法将传递与值关联的键,并将其绑定到持有该键的对象。

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

    如果replacer参数是一个数组,那么它将用于选择要序列化的成员。它过滤结果,使得只有替换器数组中列出的键的成员才被字符串化。

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

    可选的空格参数产生一个字符串化的值,用换行符和缩进填充以使其更易于阅读。

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

    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"}"
    

    参考文献

    【讨论】:

      【解决方案4】:

      嗯...YQL 会做这种事情,但那将是第三方。

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-06
        • 1970-01-01
        • 1970-01-01
        • 2021-09-22
        • 2019-09-06
        相关资源
        最近更新 更多