我正在尝试编写一个自定义JsonConverter,用于人员列表或集合的子类,但随后会向子类添加额外的属性(请参阅here)。 JSON.NET的当前实现只是将列表更改为子对象数组,并忽略所有添加的属性。所以我想编写一个新的JsonConverter来处理对象,好像它不是一个List并且只是像往常一样序列化其他所有东西,但是然后在序列化中添加一个名为'_Items'的新属性存储实际数据的位置。
现在我已经为我们特定的List子类编写了一个类,但我不得不逐个手动指定所有属性。但是,如果我可以编写一个转换器,将其视为普通对象,那么手动处理这些项目,我就是金色的。我甚至不在乎我是否最终复制了另一个班级的一半(甚至更多!)但我很乐意为这些案例制作一个可重复使用的转换器。但是,正如我所说,我找不到默认的转换器。
所以...谁知道那是哪里?
答案 0 :(得分:15)
JSON.NET中没有“默认转换器”。
如果您能够检查JsonSerializerInternalWriter类,请查看SerializeValue
方法。在其中,顶部有“转换器查找和执行”阶段。但是,如果没有匹配的转换器,它将转换为合同类型序列化(switch语句)。
我没有找到一种方法(一种正确的方法或一种优雅的黑客方式)能够通过实体上的扩展自定义序列化执行通用契约序列化(例如:正常解析对象)(我假设您正试图这样做。
答案 1 :(得分:1)
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
,我指定了在这种情况下所需的转换器。