我试图编写一个自定义JsonConverter的情况下,一个人子类的列表或集合,但随后添加额外的属性到子类(见这里)。JSON的当前实现。NET只是将列表更改为子对象数组,并忽略所有添加的属性。所以我想写一个新的JsonConverter对待对象,如果它不是一个列表,只是序列化其他一切正常,但随后在序列化中添加一个名为'_Items'的新属性,其中存储实际的数据数组。
现在,我已经为特定的List子类编写了一个类,它正是这样做的,但是我必须一个接一个地手动指定所有属性。但如果我能编写一个转换器,把它当作普通对象,然后手动处理这些项,那就太好了。我甚至不在乎我是否最终复制了另一个类的一半(甚至更多!),但我希望为这些情况制作一个可重用的转换器。但是,正如我所说的,我找不到默认的转换器。
所以…有人知道在哪里吗?
JSON.NET中没有'默认转换器'。
如果您能够检查JsonSerializerInternalWriter类,请查看SerializeValue
方法。其中,顶部有"转换器查找和执行"阶段。但是,如果没有匹配的转换器,则使用契约类型序列化(switch语句)。
我还没有找到一种方法(正确的方法或优雅的hack)能够在实体上执行通用契约序列化(例如:正常解析对象)与扩展的自定义序列化(我假设您正在尝试这样做)。
正如@dbc在这里所说的,您可以覆盖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
,我已经指定了在这种情况下我需要的转换器。
不确定从什么时候开始,如果这是答案,但有属性JsonConvert.DefaultSettings
似乎用于内部获取JsonSerializerSettings