【问题标题】:Can you extend the default JsonConverter used in JSON.NET for collections?您可以扩展 JSON.NET 中用于集合的默认 JsonConverter 吗?
【发布时间】:2011-08-18 08:54:11
【问题描述】:
我正在尝试编写一个自定义 JsonConverter 来处理一个人对列表或集合进行子类化,但随后向子类添加额外属性的情况(请参阅here)。 JSON.NET 的当前实现只是将列表更改为子对象数组并忽略所有添加的属性。所以我想写一个新的 JsonConverter 来处理对象,就好像它 不是 一个 List 并像正常一样序列化其他所有内容,然后在序列化中添加一个名为“_Items”的新属性存储实际数据数组的位置。
现在我已经为我们的特定 List 子类编写了一个完全执行此操作的类,但是我必须手动一个一个地指定所有属性。但是,如果我可以编写一个将其视为普通对象的转换器,然后手动处理这些项目,我会很高兴。我什至不在乎我是否最终会复制另一个课程的一半(甚至更多!),但我很乐意为这些案例制作一个可重复使用的转换器。但是,正如我所说,我找不到默认的转换器。
所以...有人知道那在哪里吗?
【问题讨论】:
标签:
c#
json.net
base-class
default-implementation
【解决方案1】:
JSON.NET 中没有“默认转换器”。
如果您能够检查JsonSerializerInternalWriter 类,请查看SerializeValue 方法。其中,顶部有“转换器查找和执行”阶段。但是,如果没有匹配的转换器,它会求助于合约类型序列化(switch 语句)。
我还没有找到一种方法(正确的方法或优雅的 hack)能够使用实体上的扩展自定义序列化(我假设你正在尝试做)。
【解决方案2】:
As @dbc said here,您可以覆盖CanRead 和CanWrite 以返回false 并为您的属性注册CustomAsDefaultConvertor : JsonConverter。
我的情况:
public class AsDefaultConverter : JsonConverter<JObject>
{
public override JObject ReadJson(JsonReader reader, Type objectType, JObject existingValue, bool hasExistingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override void WriteJson(JsonWriter writer, JObject value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override bool CanWrite => false;
public override bool CanRead => false;
}
我的模特:
public class MyModel
{
/// <summary>
/// Gets or sets event id
/// </summary>
public string EventId { get; set; }
/// <summary>
/// Gets or sets trigger name
/// </summary>
public string Name { get; set; }
/// <summary>
/// Gets or sets arguments
/// </summary>
[JsonConverter(typeof(AsDefaultConverter))]
public JObject Arguments { get; set; }
/// <summary>
/// Gets or sets trigger creation date
/// </summary>
public DateTimeOffset Created { get; set; }
/// <summary>
/// Gets or sets trigger creator
/// </summary>
public User CreatedBy { get; set; }
}
在启动注册时,我已经覆盖了自定义的默认 JsonSerialization,但是对于属性 JObject Arguments,我已经指定了在这种情况下我需要的转换器。