我正在尝试编写自定义的JsonConverter,以供某人将列表或集合子类化,然后将额外的属性添加到子类中(请参见here)。 JSON.NET的当前实现只是将列表更改为子对象数组,并忽略所有添加的属性。因此,我想编写一个新的JsonConverter,将对象视为不是列表,并像平常一样序列化其他所有内容,然后在序列化中添加一个名为“ _Items”的新属性,存储数据数组。
现在,我已经编写了一个类来为我们的特定List子类完成此操作,但是我必须手动逐个手动指定所有属性。但是,如果我可以编写一个将其视为普通对象的转换器,然后手动处理这些项目,那将是无与伦比的。我什至不关心我是否最终会重复另一堂课的一半(甚至更多!),但是我很想为这些情况提供一个可重用的转换器。但是,正如我所说,我找不到默认的转换器开始。
所以...有人知道那是哪里吗?
[JSON.NET中没有'默认转换器'。
如果您能够检查JsonSerializerInternalWriter类,请查看SerializeValue
方法。其中的顶部是“转换器查找和执行”阶段。但是,如果没有匹配的转换器,它将诉诸合同类型序列化(switch语句)。
我还没有找到一种方法(能够正确地解决问题,或者是一个不错的技巧),可以通过在实体上进行扩展的自定义序列化来执行通用合同序列化(例如:正常解析对象)。尝试做)。
[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;
}
MyModel:
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
,我已指定在这种情况下所需的转换器。