[英]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
在此示例中,我修改了您的原始輸入,將name
和size
字段包裝在它們自己的對象中,並將它們置於新的children
級嵌套中(我還刪除了跳過第一個子級的操作)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.