我对JSON非常陌生,所以我可能错过了一些东西。但是,这就是我正在尝试的。 我想反序列化以下类型的JSON
{
"Size":
{
"Creature":
{
"Dragon":
[
"Huge",
"Colossal",
"Mountain-sized"
],
"Wolf":
[
"Pup",
"Fully grown",
"Giant"
]
},
"Building":
[
"Small",
"Medium",
"Large"
]
}
}
JSON的核心功能旨在避免随着时间的推移会变得多么嵌套。对于具有不同亚型的生物,其亚型取决于其生物的种类,并且对于建筑物等也是如此。
我尝试使用此代码
using StreamReader r = new StreamReader("Storage.json");
string json = r.ReadToEnd();
CoreStorageDict = JsonConvert.DeserializeObject<Dictionary<string, List<string>>>(json);
我想尽可能直接将其反序列化为字典,但是我还没有找到一种好的方法来完成它,而且我认为我缺少整个系统的基本知识。
JSON错误还是我的代码错误?还是两者都有?
答案 0 :(得分:4)
如果定义以下类:
public class Creature
{
public IList<string> Dragon { get; set; }
public IList<string> Wolf { get; set; }
}
public class Size
{
public Creature Creature { get; set; }
public IList<string> Building { get; set; }
}
public class Example
{
public Size Size { get; set; }
}
,然后尝试反序列化您的json即可。您可以根据需要更改类的名称。对于上面的名称,您只需要这样做:
var result = JsonConvert.DeserializeObject<Example>(json);
您采用的方法有什么问题?
问题是您具有嵌套类型。因此,您必须正确声明每个类型,才能进行反序列化工作。
如何找到需要声明的类?
可能有一些工具可以完成这项工作。我使用的是下一个JSON Utils。只要您具有有效的json,这些工具就可以自动生成所需的类。如果我是正确的话,Visual Studio也会为您提供这种功能。
答案 1 :(得分:1)
上课绝对是上课的好方法,我同意Christos。
但是,如果您做的是一次性的事情,并且不想打扰课堂,那么可以通过将整个事情反序列化为动态,然后将需要的部分重新序列化和反序列化为期望的类型来破解它,就像这样。
var json = @"{
""Size"": {
""Creature"": {
""Dragon"": [
""Huge"",
""Colossal"",
""Mountain-sized""
],
""Wolf"": [
""Pup"",
""Fully grown"",
""Giant""
]
},
""Building"": [
""Small"",
""Medium"",
""Large""
]
}
}";
var deserialized = JsonConvert.DeserializeObject<dynamic>(json);
var thePartYouWant = deserialized.Size.Creature;
var dict = (Dictionary<string, List<string>>) JsonConvert
.DeserializeObject<Dictionary<string, List<string>>>(
(JsonConvert.SerializeObject(thePartYouWant)));
dict.Keys.ToList().ForEach(Console.WriteLine);