C# 将JSON反序列化到字典中<;字符串,对象>;

C# 将JSON反序列化到字典中<;字符串,对象>;,c#,json,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":"fo

我对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"}]}
[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; }
}
我们可以看到,它不是一个纯对象/列表文件JSON结构,因为person[number]后面的以下参数是一个列表。我尝试了很多方法,但仍然无法操作这些数据(我对JSON的理解不够深入。你能告诉我如何使用字典/数据库或任何最简单的方法访问这些数据吗

我已使用以下命令将JSON文件读入字符串:

using (StreamReader file = File.OpenText(url))
如果我的JSON文件位于:url=@MyJSONPath

在这之后我不知道该怎么办了,这个结构对我来说很奇怪

目前,我目前的进展是:

非常感谢您的回复。但我尝试使用[Data Contract],但当我复制到我的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; }
}
公共类人员1
{
公共字符串名称{get;set;}
公共整数{get;set;}
公共整数?高度{get;set;}
公共字符串{get;set;}
}
公共类人员2
{
公共字符串名称{get;set;}
公共整数{get;set;}
公共整数?高度{get;set;}
公共字符串{get;set;}
}
公共阶层人士
{
公共字符串名称{get;set;}
公共整数{get;set;}
公共整数?高度{get;set;}
公共字符串{get;set;}
}
公共类根对象
{
公共列表person1{get;set;}
公共列表person2{get;set;}
公共列表person3{get;set;}
}
你能告诉我这两种声明方式的区别吗?然后,我如何获得对象的属性。
示例:我希望将所有“名称”列在列表框中,并操纵它们的值。

如果在json对象中始终有person1、person2和person3,则可以使用以下结构:

{"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"}]}
[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++实现了这一点):

Dictionary values=JsonConvert.DeserializeObject(json);

希望它能起作用!

我的问题可能与复杂的嵌套对象有关。我确实查看了您提到的问题,但我找不到解决我的问题的方法。您已经发布了一个关于反序列化的问题,现在您正在谈论对反序列化对象的操作,它与反序列化无关。堆栈溢出不是实时教程的地方,如果你有许多单独的问题,你应该问单独的问题,而不是用下一个问题编辑现有的问题。很抱歉,这是我第一次使用堆栈,所以我弄错了。我将发布另一个主题。谢谢你,我更新了我的进度。你能检查一下吗:)我更新了我的答案,必须将
System.Runtime.Serialization
添加到项目引用中才能运行此代码