你能扩展JSON.NET中默认的JsonConverter用于集合吗?

27

我正在尝试编写一个自定义的JsonConverter,用于当一个人对列表或集合进行子类化,然后向子类添加额外属性的情况(参见这里)。JSON.NET当前的实现只会将列表更改为子对象的数组,并忽略所有添加的属性。因此,我想编写一个新的JsonConverter,将该对象视为不是列表,只需像平常一样序列化其他所有内容,但然后在序列化中添加一个名为"_Items"的新属性,其中存储了实际的数据数组。

现在,我已经为我们特定的List子类编写了完全实现此目的的类,但我必须逐个手动指定所有属性。但如果我可以编写一个将其视为普通对象,然后手动处理项的转换器,那就太好了。即使我最终要复制另一个类的一半甚至更多内容,我也很愿意制作可重复使用的转换器。但是,正如我所说,我找不到默认的转换器来开始工作。

那么,有人知道它在哪里吗?


不完全是我想要的,但它确实给了我一个实现的思路。 - Mark A. Donohoe
3个回答

16

JSON.NET没有“默认转换器”。

如果您能够检查JsonSerializerInternalWriter类,请查看SerializeValue方法。在此方法中,顶部有“查找和执行转换器”的阶段。但是,如果没有匹配的转换器,则会采用合同类型序列化(switch语句)。

我没有找到一种方法(正确的方式或优雅的黑客方式),以能够对实体执行扩展自定义序列化的通用合同序列化(例如将对象解析为正常状态)。


有点疯狂,这个问题从未被解决,所以默认逻辑正确地因素化为DefaultJsonConverter。 - MgSam

4

如 @dbc 在这里所说,您可以重写 CanReadCanWrite 来返回 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,使用了自定义的,但是对于属性,我指定了在这种情况下需要的转换器。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接