查找嵌套 json 对象深处的对象

2024-01-31

我在下面的代码片段中有嵌套的 json 对象,想要查找所有出现的“$schema”并将包含该架构值的整个对象保存到另一个对象中。我尝试使用 lodash 过滤器,但没有成功。有没有人有什么建议。

{
  "element": "parseResult",
  "content": [
    {
      "element": "category",
      "meta": {
        "classes": [
          "api"
        ],
        "title": "Test"
      },
      "attributes": {
        "meta": [
          {
            "element": "member",
            "meta": {
              "classes": [
                "user"
              ]
            },
            "content": {
              "key": {
                "element": "string",
                "content": "FORMAT"
              },
              "value": {
                "element": "string",
                "content": "1A"
              }
            }
          }
        ]
      },
      "content": [
        {
          "element": "category",
          "meta": {
            "classes": [
              "resourceGroup"
            ],
            "title": "Questions"
          },
          "content": [
            {
              "element": "resource",
              "meta": {
                "title": "Questions"
              },
              "attributes": {
                "href": "/questions"
              },
              "content": [
                {
                  "element": "transition",
                  "meta": {
                    "title": "List All Questions"
                  },
                  "content": [
                    {
                      "element": "httpTransaction",
                      "content": [
                        {
                          "element": "httpRequest",
                          "attributes": {
                            "method": "GET"
                          },
                          "content": []
                        },
                        {
                          "element": "httpResponse",
                          "attributes": {
                            "statusCode": "200",
                            "headers": {
                              "element": "httpHeaders",
                              "content": [
                                {
                                  "element": "member",
                                  "content": {
                                    "key": {
                                      "element": "string",
                                      "content": "Content-Type"
                                    },
                                    "value": {
                                      "element": "string",
                                      "content": "application/json"
                                    }
                                  }
                                }
                              ]
                            }
                          },
                          "content": [
                            {
                              "element": "dataStructure",
                              "content": [
                                {
                                  "element": "Question List"
                                }
                              ]
                            },
                            {
                              "element": "asset",
                              "meta": {
                                "classes": [
                                  "messageBody"
                                ]
                              },
                              "attributes": {
                                "contentType": "application/json"
                              },
                              "content": "[\n  {\n    \"question\": \"Favourite programming language?\",\n    \"published_at\": \"2014-11-11T08:40:51.620Z\",\n    \"url\": \"/questions/1\",\n    \"choices\": [\n      {\n        \"choice\": \"Javascript\",\n        \"url\": \"/questions/1/choices/1\",\n        \"votes\": 2048\n      }\n    ]\n  }\n]"
                            },
                            {
                              "element": "asset",
                              "meta": {
                                "classes": [
                                  "messageBodySchema"
                                ]
                              },
                              "attributes": {
                                "contentType": "application/schema+json"
                              },
                              "content": "{\n  \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n  \"type\": \"array\"\n}"
                            }
                          ]
                        }
                      ]
                    }
                  ]
                }
              ]
            },
            {
              "element": "resource",
              "meta": {
                "title": "Question"
              },
              "attributes": {
                "href": "/questions/{id}",
                "hrefVariables": {
                  "element": "hrefVariables",
                  "content": [
                    {
                      "element": "member",
                      "attributes": {
                        "typeAttributes": [
                          "required"
                        ]
                      },
                      "content": {
                        "key": {
                          "element": "string",
                          "content": "id"
                        },
                        "value": {
                          "element": "number",
                          "content": 1234
                        }
                      }
                    }
                  ]
                }
              },
              "content": [
                {
                  "element": "transition",
                  "meta": {
                    "title": "Retrieve Question"
                  },
                  "content": [
                    {
                      "element": "httpTransaction",
                      "content": [
                        {
                          "element": "httpRequest",
                          "attributes": {
                            "method": "GET"
                          },
                          "content": []
                        },
                        {
                          "element": "httpResponse",
                          "attributes": {
                            "statusCode": "200",
                            "headers": {
                              "element": "httpHeaders",
                              "content": [
                                {
                                  "element": "member",
                                  "content": {
                                    "key": {
                                      "element": "string",
                                      "content": "Content-Type"
                                    },
                                    "value": {
                                      "element": "string",
                                      "content": "application/json"
                                    }
                                  }
                                }
                              ]
                            }
                          },
                          "content": [
                            {
                              "element": "dataStructure",
                              "content": [
                                {
                                  "element": "Question"
                                }
                              ]
                            },
                            {
                              "element": "asset",
                              "meta": {
                                "classes": [
                                  "messageBody"
                                ]
                              },
                              "attributes": {
                                "contentType": "application/json"
                              },
                              "content": "{\n  \"question\": \"Favourite programming language?\",\n  \"published_at\": \"2014-11-11T08:40:51.620Z\",\n  \"url\": \"/questions/1\",\n  \"choices\": [\n    {\n      \"choice\": \"Javascript\",\n      \"url\": \"/questions/1/choices/1\",\n      \"votes\": 2048\n    }\n  ]\n}"
                            },
                            {
                              "element": "asset",
                              "meta": {
                                "classes": [
                                  "messageBodySchema"
                                ]
                              },
                              "attributes": {
                                "contentType": "application/schema+json"
                              },
                              "content": "{\n  \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n  \"type\": \"object\",\n  \"properties\": {\n    \"question\": {\n      \"type\": \"string\"\n    },\n    \"published_at\": {\n      \"type\": \"string\"\n    },\n    \"url\": {\n      \"type\": \"string\"\n    },\n    \"choices\": {\n      \"type\": \"array\"\n    }\n  },\n  \"required\": [\n    \"question\",\n    \"published_at\",\n    \"url\",\n    \"choices\"\n  ]\n}"
                            }
                          ]
                        }
                      ]
                    }
                  ]
                }
              ]
            }
          ]
        },
        {
          "element": "category",
          "meta": {
            "classes": [
              "dataStructures"
            ]
          },
          "content": [
            {
              "element": "dataStructure",
              "content": [
                {
                  "element": "object",
                  "meta": {
                    "id": "Question"
                  },
                  "content": [
                    {
                      "element": "member",
                      "attributes": {
                        "typeAttributes": [
                          "required"
                        ]
                      },
                      "content": {
                        "key": {
                          "element": "string",
                          "content": "question"
                        },
                        "value": {
                          "element": "string",
                          "content": "Favourite programming language?"
                        }
                      }
                    },
                    {
                      "element": "member",
                      "attributes": {
                        "typeAttributes": [
                          "required"
                        ]
                      },
                      "content": {
                        "key": {
                          "element": "string",
                          "content": "published_at"
                        },
                        "value": {
                          "element": "string",
                          "content": "2014-11-11T08:40:51.620Z"
                        }
                      }
                    },
                    {
                      "element": "member",
                      "attributes": {
                        "typeAttributes": [
                          "required"
                        ]
                      },
                      "content": {
                        "key": {
                          "element": "string",
                          "content": "url"
                        },
                        "value": {
                          "element": "string",
                          "content": "/questions/1"
                        }
                      }
                    },
                    {
                      "element": "member",
                      "attributes": {
                        "typeAttributes": [
                          "required"
                        ]
                      },
                      "content": {
                        "key": {
                          "element": "string",
                          "content": "choices"
                        },
                        "value": {
                          "element": "array",
                          "content": [
                            {
                              "element": "Choice"
                            }
                          ]
                        }
                      }
                    }
                  ]
                }
              ]
            },
            {
              "element": "dataStructure",
              "content": [
                {
                  "element": "object",
                  "meta": {
                    "id": "Choice"
                  },
                  "content": [
                    {
                      "element": "member",
                      "attributes": {
                        "typeAttributes": [
                          "required"
                        ]
                      },
                      "content": {
                        "key": {
                          "element": "string",
                          "content": "choice"
                        },
                        "value": {
                          "element": "string",
                          "content": "Javascript"
                        }
                      }
                    },
                    {
                      "element": "member",
                      "attributes": {
                        "typeAttributes": [
                          "required"
                        ]
                      },
                      "content": {
                        "key": {
                          "element": "string",
                          "content": "url"
                        },
                        "value": {
                          "element": "string",
                          "content": "/questions/1/choices/1"
                        }
                      }
                    },
                    {
                      "element": "member",
                      "attributes": {
                        "typeAttributes": [
                          "required"
                        ]
                      },
                      "content": {
                        "key": {
                          "element": "string",
                          "content": "votes"
                        },
                        "value": {
                          "element": "number",
                          "content": 2048
                        }
                      }
                    }
                  ]
                }
              ]
            },
            {
              "element": "dataStructure",
              "content": [
                {
                  "element": "array",
                  "meta": {
                    "id": "Question List"
                  },
                  "content": [
                    {
                      "element": "Question"
                    }
                  ]
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}

我尝试将此作为解决方案。

function getObject(theObject) {
        var result = null;
        if(theObject instanceof Array) {
            for(var i = 0; i < theObject.length; i++) {
                result = getObject(theObject[i]);
            }
        }
        else
        {
            for(var prop in theObject) {
                console.log(prop + ': ' + theObject[prop]);
                if(prop == '$schema') {
                    if(theObject[prop] == 'http://json-schema.org/draft-04/schema#') {
                        return theObject;
                    }
                }
                if(theObject[prop] instanceof Object || theObject[prop] instanceof Array)
                    result = getObject(theObject[prop]);
            }
        }
        return result;
    }

    var result = getObject(json);

Jacob,

问题出在你的 JSON 本身。你的 json 是一个键/值对。键可以是字符串(用“引号”括起来)以启用具有空格或特殊字符的属性。例如

var obj = { "my property": "my value" };
var val = obj["my property"] // "my value";

但是,如果您的值是字符串,则它们应该只包含引号,否则它不会被解析为对象 - 它将保留在字符串表示形式中。

var obj = { "foo" : "{ \"bar\" : \"my value\" }" } // notice I had to escape the strings with backslashes \
var val = obj.foo.bar // error because foo is a string with the value "{ "bar" : "my value" }"

在 json 中,content 属性的值是一个字符串:

"content": "{\n  \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n  \"type\": \"array\"\n}"

您需要用 \ 转义引号的事实也告诉您这一点。如果您希望第一次解析内容,那么它应该看起来像这样:

"content": { "$schema": "http://json-schema.org/draft-04/schema#", "type": "array" }

如果您无法更改此设置,那么您可以致电eval() http://www.w3schools.com/jsref/jsref_eval.asp or a JSON.parse() https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse将字符串解析为对象的内容(如果您的内容来自用户,这可能不安全)。

编辑: 因为您无法更改传入的 JSON,所以我创建了一个名为 deepParseObject 的函数。它绝不是防错的,但我认为它适合您的情况:

function deepParseObject(theObject) {
  for(var prop in theObject) {
      if(typeof theObject[prop] === "string" && (theObject[prop].indexOf('{') == 0 || theObject[prop].indexOf('[') == 0)) {
          theObject[prop] = JSON.parse(theObject[prop]);
      }
      if(theObject[prop] instanceof Object || theObject[prop] instanceof Array)
          deepParseObject(theObject[prop]);
  }
}

它的作用是解析内容属性(如果它们的值是字符串并以 a 开头){ or [。之后就可以调用我原来的getObject函数了。这是笨蛋。https://plnkr.co/edit/h06wuAxZkxhwCAho3OK6 https://plnkr.co/edit/h06wuAxZkxhwCAho3OK6

我在 data.js 中调用 deepParseObject,并且只使用 AngularJS 来输出结果......因为我喜欢 Angular:)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

查找嵌套 json 对象深处的对象 的相关文章

  • Google 地图上的自定义路线/路径/道路

    我需要能够使用 V2 或 V3 最好是 3 创建在某种意义上忽略建筑物的路径 我试图创建一个 kml 文件来自己绘制所有路径 然后找到某种方法根据需要打开 关闭它们 例如 用户想要从 A 点前往 B 点 这些点之间有许多建筑物 用户可以实际
  • 在承诺中运行同步函数

    我是 JS 和异步操作的新手 在使用express的nodeJS路由器中 我使用mongoose从mongo聚合了一些数据 该数据是每隔 15 分钟从不同站点收集的天气数据 我使用猫鼬聚合管道处理数据 以获取每小时数据并按每个站点进行分组
  • “过滤”JSON 以获得唯一键并获取所有相关值

    找到一个组中所有可能的相关值的最佳方法是什么 var table group a stuff new group a stuff old group b stuff newOld group b stuff old group c stuf
  • 如何检查变量是否是生成器函数? (例如函数*产量)[重复]

    这个问题在这里已经有答案了 检查函数是否是生成器的可靠方法是什么 例如 let fn function yield 100 if fn instanceof for let value in fn 我能想到的唯一方法是fn toString
  • ExtJS 4 用于选择所选值的组合框事件

    由于某种原因 我需要知道用户何时从组合框中选择了值 即使它已经被选择 仅当用户选择未选择的项目时 选择 事件才起作用 我在组合框或选择器的文档中没有看到任何类似 itemclick 的事件 有任何想法吗 ComboBox uses 绑定列表
  • 每次用户在地址栏中按 Enter 时,Firefox 插件都会执行某些操作

    我正在尝试编写一个扩展程序 用于监视每次有人在使用地址栏时按下回车键时的情况 步骤将类似于 用户在地址栏中输入一堆文本并按 Enter 键 我的插件启动并接收用户输入的内容 然后我的插件决定如何处理用户输入的字符串 我通过使用在步骤 2 中
  • 在 Javascript 中获取文本框的值

    我有这个html代码 table border cellpadding 3 cellspacing 0 tbody tr td Song td td td tr tbody table
  • HTML:您可以隐藏/忽略浏览器查找中的文本元素 (CTRL+F)

    我有一个具有相当复杂的 UI 的 Web 应用程序 并且屏幕的一部分保留用于内容 如果可能的话 我想这样做 以便当用户使用浏览器的内置文本搜索 CTRL F 时 UI 中的任何文本都将被忽略 并且仅搜索实际内容 这可行吗 CSS 和 Jav
  • webpack 加载器并包含

    我是 webpack 的新手 我正在尝试了解加载器及其属性 例如测试 加载器 包含等 这是我在 google 中找到的 webpack config js 的示例片段 module loaders test js loader babel
  • 如何在Android上获取角度中的按键事件?

    我们如何在 Android 上的 Angular 中获取按键事件及其值 我使用phonegap Cordova Angular JS
  • 如何在给定目标索引数组的情况下对数组进行就地排序?

    你如何对给定的数组进行排序arr in place给定目标索引数组ind 例如 var arr A B C D E F var ind 4 0 5 2 1 3 rearrange arr ind console log arr gt B E
  • Lodash 和 Underscore.js 之间的差异 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 为什么有人会更喜欢Lodash http lodash com or 下划线 js http underscorejs org 实用程序库优于其
  • 使用 jQuery animate 时,有没有办法隐藏 webkit 浏览器中显示的工件?

    我正在使用 jQuery animate 在网页上的项目中滑动 由于某种原因 只有在 webkit 浏览器中 元素动画的空间中才会出现伪影痕迹 有没有办法阻止或隐藏这种情况 一旦您加载此处的页面 它们就会出现在轮播上 http www my
  • 为什么发送 fetch() 时我的响应数据未定义?

    我正在尝试在客户端使用 fetch 将数据发布到我的 NodeJS 服务器或从我的 NodeJS 服务器发布数据 服务器很好地收到了 post 请求 我能够记录 req 变量 但是当我 res send any data 时 客户端无法检测
  • 如何从 WinRT StreamSocket 读取所有可用数据并清空 inputStream?

    我想在向套接字写入新数据之前读取当前正在等待套接字的所有数据 WinRT中的读取方法都是异步的 所以我不能简单地while直到套接字为空 由于我确实想丢弃套接字上的数据 因此我不想使用读取器 而是直接从套接字读取数据IInputStream
  • 使用XMLHttpRequest自动网页刷新内存泄漏

    问候 我一直在为一些使用 8 位微控制器的硬件开发网络界面 该网页使用 HTML javascript JSON 和 XHR XMLHttpRequest 进行通信 我想做的是创建一个页面 使用 setInterval 使用控制器中的新值每
  • 允许在 Safari 上聊天应用程序使用 audio.play()

    由于苹果禁用了自动播放音频的功能HTMLMedia Element play https developer mozilla org en US docs Web API HTMLMediaElement play在没有用户交互的 java
  • NodeJS 错误堆栈未定义 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在使用节点检查器 我注意到new Error 有未定义的堆栈 如果我将此值分配给一个变量 该变量将显示堆栈未定义 有趣的是 跑步new
  • 如何在画布中旋转图表同时保持数字垂直?

    我正在尝试围绕其中心旋转画布中的图表 同时保持字母直立 我正在尝试使用 ctx rotate 但它使用画布的左侧作为中心来旋转整个图表 以下链接提供了视觉效果 我希望它看起来像绿色 而不是红色 就像我的代码当前所做的那样 视觉解释 http
  • 在哪里放置资源特定逻辑

    您能帮我考虑在 AngularJS 中将资源 服务 特定的业务逻辑放置在哪里吗 我觉得在我的资源上创建一些类似模型的抽象应该很棒 但我不确定如何做 API调用 gt GET customers 1 lt first name John la

随机推荐

  • 钛金 Android 屏幕方向

    我用 Titanium 制作了一个 Android 应用程序 设备旋转时屏幕也会旋转 如何在 Android 应用程序中停止窗口 屏幕方向 Use android screenOrientation portrait 在 Android M
  • ionic 2 ion-select - 以编程方式关闭选择框

    我正在从事 ionic2 项目 我使用离子选择元件 我搜索一种在选择任何项目时以编程方式关闭选择框的方法 而不是等待用户按 确定
  • 处理无效的 XML 十六进制字符

    我尝试通过网络发送 XML 文档 但收到以下异常 MY LONG EMAIL STRING was specified for the Body element amp gt System ArgumentException x2 hexa
  • 自定义数据集和数据加载器

    我是 pytorch 的新手 我有一个大数据集 由两个 txt 文件组成 一个用于数据 另一个用于目标数据 在训练文件中 每行是长度为 340 的列表 在目标中 每行是长度为 136 的列表 我想问我如何定义我的数据集 以便我可以使用 Da
  • DialogFragment.dismiss 因 NullPointerException 崩溃

    我正在做一些后台工作并在执行此操作时显示 DialogFragment 一旦我的工作完成并调用相关回调 我就会关闭该对话框 当我这样做时 我遇到了由 Android 源中的 NPE 引起的崩溃 如下所示 void dismissIntern
  • 按顺序调用子项目和其他任务的 Gradle 批处理任务

    我正在为多模块项目编写 gradle 1 4 构建文件 所以有根构建 gradle定义如下 subprojects apply plugin java 它定义了build所有子模块的任务 子模块包含在设置 gradle每个模块都有其具有定义
  • 为什么使用 static_cast(x) 而不是 (T)x?

    我听说static cast函数应该优先于 C 风格或简单函数风格的转换 这是真的 为什么 主要原因是经典的 C 类型转换不区分我们所说的static cast lt gt reinterpret cast lt gt const cast
  • PHP 中没有 cookie 的 CSRF 令牌

    我正在寻找一种将 CSRF 令牌添加到我正在制作的应用程序中的方法 需要注意的是 该应用程序当前不使用 cookie 或会话 我很想找到一种引入 CSRF 令牌的方法 而不必 在我的应用程序中引入状态 使用会话或 cookie SESSIO
  • 读取 txt 文件 fscanf 与 fread 与 textscan [重复]

    这个问题在这里已经有答案了 我有一个从 SQL 2005 生成的 txt 文件 ANSI 格式 我努力了textscan and fscanf 整个txt文件只有numeric data 在线资源表明 fscanf 比 textscan 更
  • 获取外部文件目录失败

    OnActivityCreated 我正在做 activity getExternalFilesDir Environment DIRECTORY PICTURES 在 logcat 中我得到 com package W ContextIm
  • 流过滤器的时间复杂度

    我有这样的代码 List
  • 如何在delphi中使用ToastGeneric创建toast通知

    我正在使用 delphi 在桌面上进行开发 我想使用 ToastGeneric 类型通知创建 toast 通知 LToastFactory CreateToastNotification LXMLTemplate 另外 我正在使用 xml
  • 通过“with”语句使用 Python 队列

    有没有使用Python的标准方法Queue in a with陈述 这就是我希望能够使用它的方式 import Queue myqueue Queue Queue with myqueue as nextItem doStuff nextI
  • Shell 脚本 - 在文件中智能替换并在第二个文件中查找

    我有两个文件 一个数据文件和一个查找文件 数据文件的一个字段必须由一个值更改 该值可以在查找文件中找到 数据文件如下所示 2013 04 24 1 0 1635 1 4135 2013 04 24 1 0 9135 1 4135 2013
  • javascript 正则表达式计算空白字符

    我可以使用 javascript 正则表达式来计算字符串中第一个文本字符之前的空白字符数吗 我只关心是否有0 1和2 我当前的工作解决方案是拥有三个正则表达式 仅使用 match 来确定 0 1 或 2 类别 每个类别都有单独的模式 但我正
  • Oracle SQL 中是否有类似于 SUM 函数的 PRODUCT 函数?

    我有一个同事正在寻找这个 但我不记得曾经遇到过类似的事情 有没有一种合理的技术可以让你模拟它 SELECT PRODUCT X FROM SELECT 3 X FROM DUAL UNION ALL SELECT 5 X FROM DUAL
  • 单线程/核心上的并行如何可能?

    现代编程语言为用户提供了一流的并行和并发机制 我了解并行算法是如何编程的 并且可以很好地想象多核CPU上的两个线程如何并行运行 然而 大多数这些平台还支持在单个线程上运行并行进程 这些进程真的并行运行吗 在汇编级别上 两个不同的例程如何在单
  • 为什么这段代码在 jsbin 中有效,但在 jsfiddle 中无效?

    我按照此处另一位用户的建议重新发布 重新表述此内容 下面的代码适用于jsbin http jsbin com osebov 1 edit但不在jsfiddle http jsfiddle net wNaEX 有人知道为什么吗 该问题源于我尝
  • 如何从内容页访问母版页中的用户控件?

    假设我在母版页中有一个标头用户控件 并且想要根据母版页内加载的内容页来更改用户控件的属性 我该怎么办 Thanks 您可以使用两种方法 第一个是通过使用Page Master FindControl controlID 然后您可以将其转换为
  • 查找嵌套 json 对象深处的对象

    我在下面的代码片段中有嵌套的 json 对象 想要查找所有出现的 schema 并将包含该架构值的整个对象保存到另一个对象中 我尝试使用 lodash 过滤器 但没有成功 有没有人有什么建议 element parseResult cont