[英]Deserialize JSON into Dictionary<string,Object>
我真的是C#和JSON的新手。 我有一个具有以下结构的JSON:
{"person1":[{"name":"Bobby"},{"age":25},{"height":178},{"hobby":"piano"}],"person2":[{"name":"Tyler"},{"age":29},{"height":185}, ,{"hobby":"basketball"}],"person3":[{"name":"Mike"},{"age":30},{"height":192},{"hobby":"football"}]}
我们可以看到它不是纯对象/列表文件的JSON结构,因为person [number]之后的以下参数是一个列表。 我尝试了很多方法,但仍然无法操作这些数据(我对JSON的理解还不够深入。您能告诉我如何通过使用Dictionary / Database或最简单的方法访问那些数据。
我已经使用以下方法将JSON文件读取为字符串:
using (StreamReader file = File.OpenText(url))
如果我的JSON文件位于:url = @MyJSONPath
在这之后,我不知道该做什么了,这种结构对我来说很奇怪。
目前,我目前的进展是:
非常感谢您的回复。 但是我尝试使用[数据合同],但是当我复制到CS时该程序不接受您的代码。 (我正在使用Visual Studio 2013)无论如何,我确实找到了一个名为Json2Csharp的网站。 因此,它帮助我生成了以下代码:
public class Person1
{
public string name { get; set; }
public int? age { get; set; }
public int? height { get; set; }
public string hobby { get; set; }
}
public class Person2
{
public string name { get; set; }
public int? age { get; set; }
public int? height { get; set; }
public string hobby { get; set; }
}
public class Person3
{
public string name { get; set; }
public int? age { get; set; }
public int? height { get; set; }
public string hobby { get; set; }
}
public class RootObject
{
public List<Person1> person1 { get; set; }
public List<Person2> person2 { get; set; }
public List<Person3> person3 { get; set; }
}
您能告诉我这两种声明方式的区别吗? 在那之后,我如何获得对象的属性。 示例:我想将所有“名称”列出到列表框中并操纵其值。
如果在json对象中始终有person1,person2和person3,则可以使用以下结构:
[DataContract]
public class RootObject
{
[DataMember(Name = "person1")]
public Person[] Person1 { get; set; }
[DataMember(Name = "person2")]
public Person[] Person2 { get; set; }
[DataMember(Name="person3")]
public Person[] Person3 { get; set; }
}
[DataContract]
public class Person
{
[DataMember(Name = "name")]
public string Name { get; set; }
[DataMember(Name = "age")]
public int Age { get; set; }
[DataMember(Name = "height")]
public int Height { get; set; }
[DataMember(Name = "hobby")]
public string Hobby { get; set; }
}
更新:当然,您必须将System.Runtime.Serialization引用添加到您的项目中,才能运行此代码。 您不必使用[DataContract]
属性,它只允许您保持C#命名约定。
我不理解其余的问题(更新后)-对对象进行反序列化时,您可以像访问其他任何对象一样简单地访问其属性,因此
deserializedObject.Person1.Select(p => p.Name)
将为您获取Person1数组的所有名称。
另外,如果对JSON进行格式化,则分析JSON更容易(我为此使用Notepad ++):
{
"person1": [{
"name": "Bobby"
}, {
"age": 25
}, {
"height": 178
}, {
"hobby": "piano"
}
],
"person2": [{
"name": "Tyler"
}, {
"age": 29
}, {
"height": 185
}, , {
"hobby": "basketball"
}
],
"person3": [{
"name": "Mike"
}, {
"age": 30
}, {
"height": 192
}, {
"hobby": "football"
}
]
}
Dictionary<string, object> values = JsonConvert.DeserializeObject<Dictionary<string, object>>(json);
希望它能起作用!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.