JSON路径:按层次结构输出值加上父级

JSON Path: Outputting value plus parent hierarchically

本文关键字:输出 路径 层次结构 JSON      更新时间:2023-09-26

我是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路径验证这一点。为此,我没有工具,所以我使用jsonpath在线求值器。

我的目标是输出这样的行:

'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路径可能是一个强大的学习工具,所以如果我能在这里做到这一点,我已经学到了一些东西。

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

数组用于排序,移动项,改变顺序。对象将单个项中的属性分组

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

函数拼接是改变序列的最佳方法。在相同的领域和不同的领域相同字段

中更改顺序的示例
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);