2017-06-05 106 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对象转换为一个类并完成!