【问题标题】:Why does Newtonsoft.Json not serialise this property? [duplicate]为什么 Newtonsoft.Json 不序列化这个属性? [复制]
【发布时间】: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 不是我所知道的。你想要的输出是什么样的?

标签: c# json json.net


【解决方案1】:

这是因为您的第二个示例是一个列表,而第一个示例仅包含一个。 Json.Net 知道如何从列表中创建 json,因此忽略了其余的自定义代码。除了编写自定义格式化程序之外,您对此无能为力

【讨论】:

  • 他需要一个自定义转换器,而不是格式化程序。
猜你喜欢
  • 2012-09-21
  • 2018-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-27
  • 2012-06-07
  • 2016-06-27
相关资源
最近更新 更多