2017-06-05 39 views
0

編輯1:仍然沒有得到解決......反序列化JSON改變

編輯2:終於解決了!見下面的答案。

我想在C#中反序列化一個正在改變的JSON。因此,爲它創建類是不可能的,因爲我無法爲每個變化的部分創建類。對象是那些誰是不斷變化的,就像這樣:

不變JSON:

{ 
    "Class 1": { 
    "Blablabla": { 
     "ExampleValue1": "Example Value", 
     "ExampleValue2": 500 
    }, 
    "Blablabla-Blablabla": { 
     "ExampleValue1": "Example Value", 
     "ExampleValue2": 1000 
} 

這樣:

{ 
    "Class 1": { 
    "Blablabla-Changed-Blablabla": { 
     "ExampleValue1": "Changed Example Value", 
     "ExampleValue2": 750 
    }, 
    "Blablabla-Blablabla-Changed-Blablabla": { 
     "ExampleValue1": "Changed Example Value", 
     "ExampleValue2": 1125 
} 

我怎樣才能做到這在C#?

+0

傳入格式的集合是已知的,還是任意的? – Artak

+0

@mkArtak任意,因爲文件名正在改變。我無法通過名稱直接訪問它們。 – danielk

回答

2

您可以使用Newtonsoft.Json.LinqJToken類。

JToken token = JToken.Parse(json); 
JToken class1 = token.SelectToken("Class1"); 

注意,如果你想使用的字段名空間,你需要使用以下JSONPath符號使用SelectToken方法。

JToken token = JToken.Parse(json); 
JToken class1 = token.SelectToken("['Class 1']") 

您還可以動態地訪問JToken成員和兒童。例如,如果你想要動態打印,你可以做藥結構如下

JToken token = JToken.Parse(json); 
PrintChildren(token); 

private void PrintChildren(JToken item) 
{ 
    Console.WriteLine(item.Path); 
    foreach(var child in item.Children()) 
    { 
     PrintChildren(child); 
    } 
} 

你也可以反序列化JSON你到一個dynamic

dynamic obj = JObject.Parse(json); 

或者

dynamic obj = JsonConvert.DeserializeObject(json) 
+0

事情是,它應該枚舉它們在列表中,並且可以直接訪問,而不是通過名稱(因爲這些類名是文件名也會發生變化) – danielk

+0

@danielk我已經添加了一個示例,瞭解如何在不知道它們的情況下訪問屬性名。 – NtFreX

+0

是的,但它太複雜了,因爲我必須循環到最後。有沒有更簡單的方法來做到這一點? – danielk

0

我終於解決了。想到&後,我設法解決了這個問題。我循環訪問動態對象,將JProperty對象轉換爲一個類並完成!