C#类生成JSON集合

本文关键字:JSON 集合 | 更新日期: 2023-09-27 18:25:34

我想要以下类定义:

[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; }
}

并获得以下JSON:

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

但我最终想要得到的是:

{
    "Crowd" : 
    [
        {"Name" : "Larry", "Age" : "42", "Gender" : "M"},
        {"Name" : "Steve", "Age" : "32", "Gender" : "M"},
        {"Name" : "Nancy", "Age" : "22", "Gender" : "F"},
    ]
}

DataContractJsonSerializer类似乎忽略了[CollectionDataContract(Name = "Crowd")]属性。XML序列化程序按预期工作。

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

public class Root 
{    
    public List<Person> Crowd { get; set;} 
}
public class Person 
{
    public string Name { get; set; }
    public string Age { get; set; }
    public string Gender { get; set; } 
}

关于.NET DataContractJsonSerializer忽略CollectionDataContract属性的任何原因。有什么想法我可以强迫它产生我想要的东西吗?XML序列化程序运行良好,但我们需要使用JSON。

EDIT:因此,鉴于到目前为止的输入,这似乎是我应该为JSON生成的内容(这似乎非常合理):

{ 
  "Crowd" :{
    "Person" : 
    [
        {"Name" : "Larry", "Age" : "42", "Gender" : "M"},
        {"Name" : "Steve", "Age" : "32", "Gender" : "M"},
        {"Name" : "Nancy", "Age" : "22", "Gender" : "F"},
    ]
 }
}

C#类生成JSON集合

您没有得到您想要的输出,因为它不是有效的JSON。请参阅JSON.org。JSON对象(用大括号表示)是名称-值对的集合。它不能包含未命名的内容。

如果将所有人员放入List<Person>中并直接序列化,则可以获得以下输出,这是有效的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; }
}

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

您想要的JSON相当于拥有一个JSON对象,该对象的属性"Crowd"是一个人员数组。但是,代码并不是这样表示的。当您序列化一个Crowd对象时,它只是一个人员数组,这就是序列化程序所创建的。如果您确实需要"Crowd"属性名称,那么就别无选择,只能像您所做的那样创建一个包装类Root