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

时间:2017-04-05 12:45:29

标签: c# json

我是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"}]}

我们可以看到它不是纯粹的Object / List文件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; }
}

你能告诉我这两种声明方式的区别。之后,我如何获得对象的属性。 例如:我希望列出所有&#34; name&#34;进入列表框并操纵它们的值。

2 个答案:

答案 0 :(得分:0)

如果在你的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(我使用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"
        }
    ]
}

答案 1 :(得分:0)

Dictionary<string, object> values = JsonConvert.DeserializeObject<Dictionary<string, object>>(json);

希望它有效!