查询复杂的json

时间:2015-06-01 18:11:08

标签: javascript json filter indexof

我有JSON必须符合这个标准。

{
  "level": [
    {
      "1": {
        "Title": "My First Title",
        "Body": "My First Body"
      }
    },
    {
      "2": {
        "Title": "My Second Title",
        "Body": "My Second Body"
      }
    }
}

虽然我知道它不是世界上最好的JSON,但它必须像这样才能融入复杂的系统。我没有成功找到一种查询“第一级”内部所有内容的方法。我只需要通过“1”,“2”,“3”键来剥离json。

SQL等效项将是:

SELECT Title, Body FROM level WHERE level.id = 1.

我正在努力,因为没有身份证。关键是id因此我不知道要搜索什么。

返回的JSON应该是:

{
    "Title": "My First Title",
    "Body": "My First Body"
}

3 个答案:

答案 0 :(得分:1)

这将返回带有匹配项的Array

var queryID = "1";

yourJSON.level.filter(function(row){ return queryID in row; })

答案 1 :(得分:0)

自从你提出SQL以来......你可以使用linq.js

var data = {
  "level": [
    {
      "1": {
        "Title": "My First Title",
        "Body": "My First Body"
      }
    }, {
      "2": {
        "Title": "My Second Title",
        "Body": "My Second Body"
      }
    }
  ]
};

现在,例如:

var result = Enumerable.From(data.level)
    .Where("$.hasOwnProperty(1)")
    .FirstOrDefault(null);

result;
// {"1":{"Title":"My First Title","Body":"My First Body"}}

var result = Enumerable
    .From(data.level)
    .Select(function ($) {
        var keys = Object.keys($);
        return {
            id: keys[0],
            value: $[keys[0]]
        };
    })
    .Where("$.id == 1")
    .Select("$.value")
    .FirstOrDefault(null);

result; 
// {"Title":"My First Title","Body":"My First Body"}

答案 2 :(得分:0)

我假设您希望所有这些都是一个对象数组:

var levels = [];
json["level"].forEach(function (val) {
      Object.keys(val).forEach(function (key) {
          levels[key] = val[key];
      });
});

现在,如果您查询级别[id],您应该得到所需的结果。

查看此示例: https://jsfiddle.net/c2vk5c6m/