簡體   English   中英

使用 Newtonsoft.Json 將分層 Json 數據轉換為平面 Json

[英]Convert hierarchical Json data to flat Json with using Newtonsoft.Json

我現在正在與 3rd 方系統交互。 而且全世界都有1000多個系統,不知道格式會怎么樣。 所以我想通過設置動態解析它(不一一更改源代碼)

現在我使用 C# Newtonsoft.Json 並且 Json 文件包含分層數據。 想要將其轉換為平面 Json 數據。

輸入

{
  "name": "root",
  "children": [
    {
      "name": "First Top",
      "children": [
        {
          "name": "First child",
          "children": [
            {
              "name": "value1",
              "size": "320"
            }
          ]
        },
        {
          "dep": "First Top",
          "name": "First child",
          "model": "value2",
          "size": "320"
        },
        {
          "dep": "First Top",
          "name": "First child",
          "model": "value3",
          "size": "320"
        },
        {
          "dep": "First Top",
          "name": "First child",
          "model": "value4",
          "size": "320"
        },
        {
          "dep": "First Top",
          "name": "SECOND CHILD",
          "model": "value1",
          "size": "320"
        },
        {
          "dep": "First Top",
          "name": "SECOND CHILD",
          "model": "value2",
          "size": "320"
        },
        {
          "dep": "First Top",
          "name": "SECOND CHILD",
          "model": "value3",
          "size": "320"
        },
        {
          "dep": "First Top",
          "name": "SECOND CHILD",
          "model": "value4",
          "size": "320"
        }
      ]
    },
    {
      "name": "Second Top",
      "children": [
        {
          "name": "First Child",
          "children": [
            {
              "name": "value1",
              "size": "320"
            }
          ]
        },
        {
          "dep": "Second Top",
          "name": "First Child",
          "model": "value2",
          "size": "320"
        },
        {
          "dep": "Second Top",
          "name": "First Child",
          "model": "value3",
          "size": "320"
        },
        {
          "dep": "Second Top",
          "name": "First Child",
          "model": "value4",
          "size": "320"
        },
        {
          "dep": "Second Top",
          "name": "SECOND CHILD",
          "model": "value1",
          "size": "320"
        },
        {
          "dep": "Second Top",
          "name": "SECOND CHILD",
          "model": "value2",
          "size": "320"
        },
        {
          "dep": "Second Top",
          "name": "SECOND CHILD",
          "model": "value3",
          "size": "320"
        },
        {
          "dep": "Second Top",
          "name": "SECOND CHILD",
          "model": "value4",
          "size": "320"
        }
      ]
    },
    {
      "name": "Third Top",
      "children": [
        {
          "name": "First Child",
          "children": [
            {
              "name": "value2",
              "size": "320"
            }
          ]
        },
        {
          "dep": "Third Top",
          "name": "First Child",
          "model": "value3",
          "size": "320"
        },
        {
          "dep": "Third Top",
          "name": "First Child",
          "model": "value4",
          "size": "320"
        },
        {
          "dep": "Third Top",
          "name": "First Child",
          "model": "value5",
          "size": "320"
        },
        {
          "dep": "Third Top",
          "name": "Second Child",
          "model": "value1",
          "size": "320"
        },
        {
          "dep": "Third Top",
          "name": "Second Child",
          "model": "value2",
          "size": "320"
        },
        {
          "dep": "Third Top",
          "name": "Second Child",
          "model": "value3",
          "size": "320"
        },
        {
          "dep": "Third Top",
          "name": "Second Child",
          "model": "value4",
          "size": "320"
        }
      ]
    }
  ]
}

輸出

    { "dep": "First Top", "name": "First child", "model": "value1", "size": "320" },
    { "dep": "First Top", "name": "First child", "model": "value2", "size": "320" },
    { "dep": "First Top", "name": "First child", "model": "value3", "size": "320" },
    { "dep": "First Top", "name": "First child", "model": "value4", "size": "320" },
    { "dep": "First Top", "name": "SECOND CHILD", "model": "value1", "size": "320" },
    { "dep": "First Top", "name": "SECOND CHILD", "model": "value2", "size": "320" },
    { "dep": "First Top", "name": "SECOND CHILD", "model": "value3", "size": "320" },
    { "dep": "First Top", "name": "SECOND CHILD", "model": "value4", "size": "320" },
    { "dep": "Second Top", "name": "First Child", "model": "value1", "size": "320" },
    { "dep": "Second Top", "name": "First Child", "model": "value2", "size": "320" },
    { "dep": "Second Top", "name": "First Child", "model": "value3", "size": "320" },
    { "dep": "Second Top", "name": "First Child", "model": "value4", "size": "320" },
    { "dep": "Second Top", "name": "SECOND CHILD", "model": "value1", "size": "320" },
    { "dep": "Second Top", "name": "SECOND CHILD", "model": "value2", "size": "320" },
    { "dep": "Second Top", "name": "SECOND CHILD", "model": "value3", "size": "320" },
    { "dep": "Second Top", "name": "SECOND CHILD", "model": "value4", "size": "320" },
    { "dep": "Third Top", "name": "First Child", "model": "value2", "size": "320" },
    { "dep": "Third Top", "name": "First Child", "model": "value3", "size": "320" },
    { "dep": "Third Top", "name": "First Child", "model": "value4", "size": "320" },
    { "dep": "Third Top", "name": "First Child", "model": "value5", "size": "320" },
    { "dep": "Third Top", "name": "Second Child", "model": "value1", "size": "320" },
    { "dep": "Third Top", "name": "Second Child", "model": "value2", "size": "320" },
    { "dep": "Third Top", "name": "Second Child", "model": "value3", "size": "320" },
    { "dep": "Third Top", "name": "Second Child", "model": "value4", "size": "320" }

我曾嘗試動態循環但未能成功。 我認為,需要通過遞歸調用方法來完成。

提前致謝。

Newtonsoft.Json庫支持LINQ ,因此您可以使用 C# 的SelectMany() (以及許多其他 LINQ 運算符)輕松地展平集合。

例如:

using Newtonsoft.Json.Linq;

var input = "{ 'name': 'root', 'children': [ { 'name': 'First Top', 'children': [ { 'name': 'First child', 'children': [ { 'name': 'value1', 'size': '320' } ] }, { 'dep': 'First Top', 'name': 'First child', 'model': 'value2', 'size': '320' }, { 'dep': 'First Top', 'name': 'First child', 'model': 'value3', 'size': '320' }, { 'dep': 'First Top', 'name': 'First child', 'model': 'value4', 'size': '320' }, { 'dep': 'First Top', 'name': 'SECOND CHILD', 'model': 'value1', 'size': '320' }, { 'dep': 'First Top', 'name': 'SECOND CHILD', 'model': 'value2', 'size': '320' }, { 'dep': 'First Top', 'name': 'SECOND CHILD', 'model': 'value3', 'size': '320' }, { 'dep': 'First Top', 'name': 'SECOND CHILD', 'model': 'value4', 'size': '320' } ] }, { 'name': 'Second Top', 'children': [ { 'name': 'First Child', 'children': [ { 'name': 'value1', 'size': '320' } ] }, { 'dep': 'Second Top', 'name': 'First Child', 'model': 'value2', 'size': '320' }, { 'dep': 'Second Top', 'name': 'First Child', 'model': 'value3', 'size': '320' }, { 'dep': 'Second Top', 'name': 'First Child', 'model': 'value4', 'size': '320' }, { 'dep': 'Second Top', 'name': 'SECOND CHILD', 'model': 'value1', 'size': '320' }, { 'dep': 'Second Top', 'name': 'SECOND CHILD', 'model': 'value2', 'size': '320' }, { 'dep': 'Second Top', 'name': 'SECOND CHILD', 'model': 'value3', 'size': '320' }, { 'dep': 'Second Top', 'name': 'SECOND CHILD', 'model': 'value4', 'size': '320' } ] }, { 'name': 'Third Top', 'children': [ { 'name': 'First Child', 'children': [ { 'name': 'value2', 'size': '320' } ] }, { 'dep': 'Third Top', 'name': 'First Child', 'model': 'value3', 'size': '320' }, { 'dep': 'Third Top', 'name': 'First Child', 'model': 'value4', 'size': '320' }, { 'dep': 'Third Top', 'name': 'First Child', 'model': 'value5', 'size': '320' }, { 'dep': 'Third Top', 'name': 'Second Child', 'model': 'value1', 'size': '320' }, { 'dep': 'Third Top', 'name': 'Second Child', 'model': 'value2', 'size': '320' }, { 'dep': 'Third Top', 'name': 'Second Child', 'model': 'value3', 'size': '320' }, { 'dep': 'Third Top', 'name': 'Second Child', 'model': 'value4', 'size': '320' } ] } ] }";

var root = JObject.Parse(input);
var rootChildren = (JArray)root["children"];
var flattened = rootChildren.SelectMany(child => ((JArray)child["children"]).Skip(1)); // Skip the first one as it's irrelevant for the output.

// Create a JArray from the flattened collection (of JTokens)
// to be able to easily output it as a JSON string.
var jArray = new JArray(flattened);
var output = jArray.ToString();

你會注意到我跳過了第二個孩子嵌套的第一個children 我這樣做只是為了匹配您的預期輸出,由於某種原因,它沒有包含每個嵌套集合的第一個子項。

作為您可以使用此解決方案執行的操作的示例(考慮到動態嵌套級別的要求),請考慮以下示例: https : //dotnetfiddle.net/ikM1Ov

在此示例中,我修改了您的原始輸入,將namesize字段包裝在它們自己的對象中,並將它們置於新的children級嵌套中(我還刪除了跳過第一個子級的操作)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM