我想要以下类定义:
[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"},
]
}
}
答案 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
。