我在json字符串的根元素MENUSTRUCT
中定义了MENUITEM
和SCREEN
条目。
这里重要的是MENUITEM
可以包含其他MENUITEM
或SCREEN
。
我想用json.NET解析整个json字符串,在那里我应该接收一个具有MENUITEM
s的树,该树可以包含嵌套的MENUITEM
s或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>
,但整个事情都不成功。我认为反序列化程序无法处理嵌套的MenuItem
s。
我也尝试过用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"
}
]
}
]
}
]
}
}
JSONLint JSON验证器