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"},
]
}
}
您没有得到您想要的输出,因为它不是有效的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
。