C#类生成JSON集合

时间:2014-10-03 22:07:56

标签: 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 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。

编辑:所以考虑到目前为止的输入,似乎这就是我应该为我的JSON生成的东西(看起来非常合理):

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

2 个答案:

答案 0 :(得分:1)

您没有获得所需的输出,因为它不是有效的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; }
}

答案 1 :(得分:0)

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

你想要的JSON等同于拥有一个带有属性的JSON对象&#34; Crowd&#34;那是一群人。但是,这不是代码的表示方式。序列化Crowd对象时,它只是一个人员数组,这就是序列化程序创建的对象。如果你真的需要&#34; Crowd&#34;属性名称,然后没有选项,只能像你一样创建一个包装类Root