C# 类生成JSON集合

C# 类生成JSON集合,c#,json,serialization,C#,Json,Serialization,我希望有以下类定义: [Serializable] [CollectionDataContract(Name = "Crowd")] public class Crowd : List<Person> { } [DataContract(Name = "Person")] public class Person { public string Name { get; set; } public string Age { get; set; } public

我希望有以下类定义:

[Serializable]
[CollectionDataContract(Name = "Crowd")]
public class Crowd : List<Person>
{
}

[DataContract(Name = "Person")]
public class Person
{
    public string Name { get; set; }
    public string Age { get; set; }
    public string Gender { get; set; }
}
但我最终想要得到的是:

{
    "Crowd" : 
    [
        {"Name" : "Larry", "Age" : "42", "Gender" : "M"},
        {"Name" : "Steve", "Age" : "32", "Gender" : "M"},
        {"Name" : "Nancy", "Age" : "22", "Gender" : "F"},
    ]
}
似乎
DataContractJsonSerializer
类忽略了
[CollectionDataContract(Name=“Crowd”)]
属性。XML序列化按预期工作

这将起作用,但我不想这样定义我的类(删除类属性以显示结构):


与需要根元素的XML不同,JSON不需要根元素。整个JSON本身就是根元素,因此不会生成您要查找的JSON


您想要的JSON相当于拥有一个JSON对象,该对象的属性“Crowd”是一个人员数组。但是,这不是代码的表示方式。当序列化
群组
对象时,它只是一个人员数组,这是序列化程序创建的。如果确实需要“Crowd”属性名,那么除了像您所做的那样创建一个包装类
Root

您无法获得所需的输出,因为它不是有效的JSON。看见JSON对象(用大括号表示)是名称-值对的集合。它不能包含未命名的内容

如果您将所有人员放入一个
列表中
,并直接对其进行序列化,则可以获得以下有效的JSON输出:

[
    {"Name" : "Larry", "Age" : "42", "Gender" : "M"},
    {"Name" : "Steve", "Age" : "32", "Gender" : "M"},
    {"Name" : "Nancy", "Age" : "22", "Gender" : "F"},
]
示例代码:

class Program
{
    static void Main(string[] args)
    {
        List<Person> list = new List<Person>
        {
            new Person {Name = "Larry", Age = "42", Gender = "M"},
            new Person {Name = "Steve", Age = "32", Gender = "M"},
            new Person {Name = "Nancy", Age = "22", Gender = "F"},
        };

        DataContractJsonSerializer ser = 
            new DataContractJsonSerializer(typeof(List<Person>));
        MemoryStream ms = new MemoryStream();
        ser.WriteObject(ms, list);

        ms.Position = 0;
        StreamReader sr = new StreamReader(ms);
        Console.WriteLine(sr.ReadToEnd());
    }
}

[DataContract]
public class Person
{
    [DataMember]
    public string Name { get; set; }
    [DataMember]
    public string Age { get; set; }
    [DataMember]
    public string Gender { get; set; }
}
类程序
{
静态void Main(字符串[]参数)
{
列表=新列表
{
新人{Name=“Larry”,Age=“42”,Gender=“M”},
新人{Name=“Steve”,Age=“32”,Gender=“M”},
新人{Name=“Nancy”,Age=“22”,Gender=“F”},
};
DataContractJsonSerializer ser=
新的DataContractJsonSerializer(类型(列表));
MemoryStream ms=新的MemoryStream();
ser.WriteObject(ms,列表);
ms.Position=0;
StreamReader sr=新的StreamReader(毫秒);
Console.WriteLine(sr.ReadToEnd());
}
}
[数据合同]
公共阶层人士
{
[数据成员]
公共字符串名称{get;set;}
[数据成员]
公共字符串年龄{get;set;}
[数据成员]
公共字符串{get;set;}
}

谢谢你。我的研究也指向这个方向。奇怪的是,JSON不需要根元素,并且考虑到我当前的输出,集合似乎没有类型属性,只有一堆重复的列,没有“根”名称将它们连接在一起。如果有人得到了这个集合,它可以是任何数量的东西,比如“罪犯”、“教师”、“管理者”等等。再次感谢您在这个主题上的投入。当您将JSON是表示Javascript对象的方式这一事实联系起来时,它就变成了语义。在JSON中表示的是一个数组对象,用另一个属性表示子对象是次优的。Javascript本身不支持面向对象,因此一切都是对象。可以将其视为序列化.NET动态对象。如果希望序列化该类型,则应包含一个显示该类型的属性。例如像BreezeJS这样的框架,它在将数据从.NET序列化到Javascript时会这样做。谢谢Brian。根据您的回答,我编辑了我的问题,注意到我应该使用的替代JSON。我没有意识到这不是我想要生成的有效JSON对象。考虑到这个新的JSON,我在使用通用列表和著名的序列化程序来获取我想要的JSON时遇到了问题。我得到的是以泛型列表类命名的根,而不是以派生类命名的根。类群组:List.NET似乎忽略了CollectionDataContract属性。有什么想法吗?通常,您的类结构需要与您想要的JSON输出相匹配。因此,如果希望JSON有一个根对象,其中包含一个名为“Crowd”的属性,该属性是一个包含Person对象的数组,则需要提供一个根类,其中包含一个名为“Crowd”的成员。既然你在问题中说你不想这样做,我能想到的唯一选择就是切换到不同的序列化程序。如果您使用Json.Net,您可以创建一个自定义JsonConverter来执行您想要的操作。转换器允许类结构不同于JSON。再次感谢Brian。我感谢你在这个话题上的投入和时间。我将使用您最初推荐的JSON输出。没问题。祝你的项目好运。
{ 
  "Crowd" :{
    "Person" : 
    [
        {"Name" : "Larry", "Age" : "42", "Gender" : "M"},
        {"Name" : "Steve", "Age" : "32", "Gender" : "M"},
        {"Name" : "Nancy", "Age" : "22", "Gender" : "F"},
    ]
 }
}
[
    {"Name" : "Larry", "Age" : "42", "Gender" : "M"},
    {"Name" : "Steve", "Age" : "32", "Gender" : "M"},
    {"Name" : "Nancy", "Age" : "22", "Gender" : "F"},
]
class Program
{
    static void Main(string[] args)
    {
        List<Person> list = new List<Person>
        {
            new Person {Name = "Larry", Age = "42", Gender = "M"},
            new Person {Name = "Steve", Age = "32", Gender = "M"},
            new Person {Name = "Nancy", Age = "22", Gender = "F"},
        };

        DataContractJsonSerializer ser = 
            new DataContractJsonSerializer(typeof(List<Person>));
        MemoryStream ms = new MemoryStream();
        ser.WriteObject(ms, list);

        ms.Position = 0;
        StreamReader sr = new StreamReader(ms);
        Console.WriteLine(sr.ReadToEnd());
    }
}

[DataContract]
public class Person
{
    [DataMember]
    public string Name { get; set; }
    [DataMember]
    public string Age { get; set; }
    [DataMember]
    public string Gender { get; set; }
}