JSON路径:分层输出值加父级

时间:2016-10-14 22:06:28

标签: javascript json jsonpath

我是JSON Path的新手,所以这可能比我预期的要简单,如果可能的话。

我有一个JSON块,它由一组组成,每组都有一组字段。每个组也有一个序列,每个字段也是如此。字段序列表示组内的顺序,组序列表示组本身的显示顺序。

我在C#中以编程方式生成了具有不同序列值的项目(组和字段)的平面列表,因此我想验证我的输出,并通过扩展来验证我的分组算法。

JSON块看起来(大大简化)如下:

{
  "groups": [
    {
      "sequence": 0,
      "fields": [
        {
          "sequence": 0
        },
        {
          "sequence": 1
        },
        {
          "sequence": 2
        }
      ]
    },
    {
      "sequence": 1,
      "fields": [
        {
          "sequence": 0
        },
        {
          "sequence": 1
        }
      ]
    },
    {
      "sequence": 2,
      "fields": [
        {
          "sequence": 0
        },
        {
          "sequence": 1
        },
        {
          "sequence": 2
        }
      ]
    }
  ]
}

我正在尝试使用JSON Path验证这一点。为此,我没有工具,所以我使用的是jsonpath online evaluator

我的目标是按照以下方式输出:

'0'
   'sequence' => '0'
   'fields'...
      '0'
         'sequence' => '0'
      '1'
         'sequence' => '1'
      '2'
         'sequence' => '2'
// etc...

换句话说,我正在寻找一个JSON路径查询,它可以在层次结构中返回每个组的序列加上组中每个字段的序列。

要获取组的序列,我正在使用以下内容。这很好,并且给了我有用的输出,因为组已经是顶级项目了:

$.groups[*].sequence

输出:

'0' => "0"
'1' => "1"
'2' => "2"

要获取组中字段的顺序,我使用以下内容。这里的输出不太有用,因为如果我在几个组中分布了数十个或更多的字段,那么它就是一个难以阅读的平面列表。

$.groups[*].fields[*].sequence

输出:

'0' => "0"
'1' => "1"
'2' => "2"
'3' => "0"
'4' => "1"
'5' => "0"
'6' => "1"
'7' => "2"

所以最终,问题是:是否有一个JSON路径查询,让我可以在这里分层次地获取我需要的信息?或者我使用错误的工具来完成工作?我想我可以在JavaScript中编写几行代码,如果必须的话,可以让我这样做,但似乎JSON路径可能是一个强大的学习工具,所以如果我能在这里做到,我已经学到了一些东西。

1 个答案:

答案 0 :(得分:1)

您不需要变量序列。当你需要序列时,将项目从一个组移动到另一个组,排序你可以在对象中使用数组,在数组中使用对象。

用于排序,移动项目,更改序列的数组。用于对单个项目中的属性进行分组的对象

var groups = 
  [
    {"fields": [
        {name: 'field1'},
        {name: 'field2'},
        {name: 'field3'}
        ],
    },

    {"fields": [
        {name: 'field1'},
        {name: 'field2'},
        {name: 'field3'}
      ]
    },

    {"fields": [
        {name: 'field1'},
        {name: 'field2'},
        {name: 'field3'}
      ]
    }
  ];
console.log(groups[0].fields);            // Array [ Object, Object, Object ]
console.log(groups[2].fields[0].name);    // field1

Function splice是改变序列的最佳选择。在相同的领域和另一个领域 相同字段中变更序列的示例

var  oldIndex = 2, newIndex = 0, item = groups[0].fields.splice(oldIndex, 1)[0];
console.log(item);

groups[0].fields.splice(newIndex, 0, item);
console.log(groups);