【发布时间】:2017-12-11 23:43:56
【问题描述】:
考虑以下程序:(.NET Fiddle Link)
public class Program
{
public static void Main()
{
var carsa = new ListOfCarsA();
carsa.Cars.Add("Toyota");
carsa.Cars.Add("Lexus");
Console.WriteLine(JsonConvert.SerializeObject(carsa, Formatting.Indented));
var carsb = new ListOfCarsB();
carsb.Add("Nissan");
carsb.Add("Infiniti");
Console.WriteLine(JsonConvert.SerializeObject(carsb, Formatting.Indented));
}
}
public class ListOfCarsA
{
public string CollectionName { get { return "CarsA"; } }
public List<string> Cars { get; set; }
public ListOfCarsA()
{
Cars = new List<string>();
}
}
public class ListOfCarsB : List<string>
{
public string CollectionName { get { return "CarsB"; } }
}
然后输出以下内容:
{ "CollectionName": "CarsA", “汽车”: [ “丰田”, “雷克萨斯” ] }
还有
[ “日产”, “英菲尼迪” ]
为什么CollectionName 属性没有被序列化并输出CarsB,但ListOfCarsA 上的相同属性导致CarsA 被序列化?
这个问题的解决方案是什么 - 我怎么会有一个类似于 ListOfCarsB 的类,但仍然有任何额外的成员序列化?我曾尝试使用属性[JsonProperty("CollectionName"] 和[JsonRequired],但这些似乎无济于事。
【问题讨论】:
-
这是设计使然。该框架将 IEnumerables 视为集合并将它们序列化为 JSON 数组。您的 ListOfCarsB 是派生集合。所有其他属性都被忽略。同样的原因,您没有看到
List.Count属性被显示。 -
有什么解决方法吗? @Nkosi
-
JSON 中没有任何内容可以表示“值和其他一些属性的集合”。如果需要,请按照 ListOfCarsA 使用 compisition。
-
@DannyGoodall 不是我所知道的。你想要的输出是什么样的?