[英]How can I parse recursive data structures with JSON.NET?
我在json字符串的根元素MENUSTRUCT
定義了MENUITEM
和SCREEN
條目。
這里重要的是MENUITEM
可以包含其他MENUITEM
或SCREEN
。
我想用JSON.NET解析整個json字符串,我應該在其中收到一棵包含MENUITEM
的樹,其中可以包含龐大的嵌套MENUITEM
或SCREEN
條目鏈。
我從以下json字符串中摘錄了許多嵌套結構:
{
"MENUSTRUCT": {
"-text": "GUI.Menu.Root",
"-image": "GUI.Menu.Home",
"-mask": "GUI.Menu.Home.Mask",
"-color": "#E0E0FF",
"-menuid": "MENUTREE",
"MENUITEM": [
{
"-text": "GUI.Menu.Text.00000003",
"-image": "GUI.Menu.Menu",
"-mask": "GUI.Menu.Menu.Mask",
"-color": "#C0C0FF",
"-menuid": "Menu.ID.00000003",
"SCREEN": [
{
"-id": "GUI.Dlg.StartupScreen",
"-text": "GUI.Menu.Text.00000103",
"-image": "GUI.Menu.Screen",
"-mask": "GUI.Menu.Screen.Mask",
"-menuid": "Menu.ID.00000103"
},
{
"-id": "GUI.Dlg.Calls",
"-text": "GUI.Menu.Text.Calls",
"-image": "GUI.Menu.Screen",
"-mask": "GUI.Menu.Screen.Mask",
"-menuid": "Menu.ID.00000203"
}
],
"MENUITEM": [
{
"-text": "GUI.Menu.Text.00000603",
"-image": "GUI.Menu.Menu",
"-mask": "GUI.Menu.Menu.Mask",
"-color": "#A0A0FF",
"-menuid": "Menu.ID.00000603",
"SCREEN": [
{
"-id": "GUI.Dlg.SpecialTrips",
"-text": "GUI.Menu.Text.00010603",
"-image": "GUI.Menu.Screen",
"-mask": "GUI.Menu.Screen.Mask",
"-menuid": "Menu.ID.00010603"
},
{
"-id": "GUI.Dlg.SpecialTrips",
"-text": "GUI.Menu.Text.00020603",
"-image": "GUI.Menu.Screen",
"-mask": "GUI.Menu.Screen.Mask",
"-menuid": "Menu.ID.00020603"
}
] // end of screen
}
] // end of nested menuitem
},
/* snipped following menuitems */
] // end of menuitem array
}
}
我試圖用反序列化整個事情
JsonConvert.DeserializeObject<List<MenuItem>>(jsonString);
我有一個對象MenuItem
,它具有List<Screen>
的屬性和List<MenuItem>
一個屬性,但整個操作List<MenuItem>
。 我認為解串器無法處理嵌套的MenuItem
。
我也嘗試使用JObject
解析樹,但我認為這種方式需要您自己實現很多解析。
JObject obj = JObject.Parse(json);
var menuItems = from m in obj["MENUSTRUCT"]["MENUITEM"].Children() select m;
List<MenuEntry> menues = this.LoadMenuStructure(menuItems);
在這里,我必須確保我使用的是正確的JToken
但是我不知道我是使用MenuItem
還是Screen
。
有沒有其他更簡單的方法來反序列化json字符串,而不會在所有結構中嵌套我呢?
在此先感謝您的幫助。
你的原劇本中有錯誤,它有一個額外的空白,
向底部。 我也刪除了C# //
Comments標簽,這現在應該對您有用
{
"MENUSTRUCT": {
"-text": "GUI.Menu.Root",
"-image": "GUI.Menu.Home",
"-mask": "GUI.Menu.Home.Mask",
"-color": "#E0E0FF",
"-menuid": "MENUTREE",
"MENUITEM": [
{
"-text": "GUI.Menu.Text.00000003",
"-image": "GUI.Menu.Menu",
"-mask": "GUI.Menu.Menu.Mask",
"-color": "#C0C0FF",
"-menuid": "Menu.ID.00000003",
"SCREEN": [
{
"-id": "GUI.Dlg.StartupScreen",
"-text": "GUI.Menu.Text.00000103",
"-image": "GUI.Menu.Screen",
"-mask": "GUI.Menu.Screen.Mask",
"-menuid": "Menu.ID.00000103"
},
{
"-id": "GUI.Dlg.Calls",
"-text": "GUI.Menu.Text.Calls",
"-image": "GUI.Menu.Screen",
"-mask": "GUI.Menu.Screen.Mask",
"-menuid": "Menu.ID.00000203"
}
],
"MENUITEM": [
{
"-text": "GUI.Menu.Text.00000603",
"-image": "GUI.Menu.Menu",
"-mask": "GUI.Menu.Menu.Mask",
"-color": "#A0A0FF",
"-menuid": "Menu.ID.00000603",
"SCREEN": [
{
"-id": "GUI.Dlg.SpecialTrips",
"-text": "GUI.Menu.Text.00010603",
"-image": "GUI.Menu.Screen",
"-mask": "GUI.Menu.Screen.Mask",
"-menuid": "Menu.ID.00010603"
},
{
"-id": "GUI.Dlg.SpecialTrips",
"-text": "GUI.Menu.Text.00020603",
"-image": "GUI.Menu.Screen",
"-mask": "GUI.Menu.Screen.Mask",
"-menuid": "Menu.ID.00020603"
}
]
}
]
}
]
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.