簡體   English   中英

如何使用JSON.NET解析遞歸數據結構?

[英]How can I parse recursive data structures with JSON.NET?

我在json字符串的根元素MENUSTRUCT定義了MENUITEMSCREEN條目。

這里重要的是MENUITEM可以包含其他MENUITEMSCREEN

我想用JSON.NET解析整個json字符串,我應該在其中收到一棵包含MENUITEM的樹,其中可以包含龐大的嵌套MENUITEMSCREEN條目鏈。

我從以下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"
                            }
                        ]
                    }
                ]
            }
        ]
    }
}

JSONLint JSON驗證程序

暫無
暫無

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

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