您可以扩展JSON.NET中用于集合的默认JsonConverter吗?

问题描述 投票:24回答:2

我正在尝试编写自定义的JsonConverter,以供某人将列表或集合子类化,然后将额外的属性添加到子类中(请参见here)。 JSON.NET的当前实现只是将列表更改为子对象数组,并忽略所有添加的属性。因此,我想编写一个新的JsonConverter,将对象视为不是列表,并像平常一样序列化其他所有内容,然后在序列化中添加一个名为“ _Items”的新属性,存储数据数组。

现在,我已经编写了一个类来为我们的特定List子类完成此操作,但是我必须手动逐个手动指定所有属性。但是,如果我可以编写一个将其视为普通对象的转换器,然后手动处理这些项目,那将是无与伦比的。我什至不关心我是否最终会重复另一堂课的一半(甚至更多!),但是我很想为这些情况提供一个可重用的转换器。但是,正如我所说,我找不到默认的转换器开始。

所以...有人知道那是哪里吗?

json.net base-class default-implementation
2个回答
15
投票

[JSON.NET中没有'默认转换器'。

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

我还没有找到一种方法(能够正确地解决问题,或者是一个不错的技巧),可以通过在实体上进行扩展的自定义序列化来执行通用合同序列化(例如:正常解析对象)。尝试做)。


0
投票

[As @dbc said here,您可以覆盖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;
}

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,我已指定在这种情况下所需的转换器。

© www.soinside.com 2019 - 2024. All rights reserved.