【问题标题】:Custom json serialization for each item in IEnumerable [duplicate]IEnumerable中每个项目的自定义json序列化[重复]
【发布时间】:2016-04-12 17:46:48
【问题描述】:

我正在使用 Json.NET 序列化具有枚举的 IEnumerableDateTime 的对象。是这样的:

class Chart
{
    // ...
    public IEnumerable<int> YAxis { get; set; }

    public IEnumerable<State> Data { get; set; }

    public IEnumerable<DateTime> XAxis { get; set; }
}

但我需要一个自定义的JsonConverter 来使枚举序列化为字符串并更改DateTime 字符串格式。

我已经尝试使用JsonConverter 提到的here 属性作为枚举和自定义IsoDateTimeConverter 就像here 一样:

[JsonConverter(typeof(StringEnumConverter))]
public IEnumerable<State> Data { get; set; }

[JsonConverter(typeof(MyDateTimeConverter))]
public IEnumerable<DateTime> XAxis { get; set; }

我希望它也适用于 IEnumerable,但不出所料,它不会:

无法将“WhereSelectArrayIterator`2[System.Int32,Model.State]”类型的对象转换为“System.Enum”类型。

有没有办法说JsonConverterAttribute 适用于每个项目而不是可枚举本身?

【问题讨论】:

  • @juharr 这实际上是为了分享一些阻碍我的东西。并且认为我为自己的谷歌搜索技能感到自豪......

标签: c# json json.net


【解决方案1】:

事实证明,对于可枚举,您必须使用 JsonPropertyAttributeItemConverterType 属性,如下所示:

[JsonProperty(ItemConverterType = typeof(StringEnumConverter))]
public IEnumerable<State> Data { get; set; }

[JsonProperty(ItemConverterType = typeof(MyDateTimeConverter))]
public IEnumerable<DateTime> XAxis { get; set; }

documentation 中提到了这一点:

要将 JsonConverter 应用于集合中的项目,请使用 JsonArrayAttribute、JsonDictionaryAttribute 或 JsonPropertyAttribute 并将 ItemConverterType 属性设置为您要使用的转换器类型。

您可能会对JsonArrayAttribute 感到困惑,但它 无法定位属性。

【讨论】:

    猜你喜欢
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 2016-06-25
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多