繁体   English   中英

将JSON反序列化为Dictionary <string,Object>

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM