JSON.NET中使用的默认JsonConverter是什么?

时间:2011-05-04 09:03:44

标签: json.net base-class default-implementation

我正在尝试编写一个自定义JsonConverter,用于人员列表或集合的子类,但随后会向子类添加额外的属性(请参阅here)。 JSON.NET的当前实现只是将列表更改为子对象数组,并忽略所有添加的属性。所以我想编写一个新的JsonConverter来处理对象,好像它不是一个List并且只是像往常一样序列化其他所有东西,但是然后在序列化中添加一个名为'_Items'的新属性存储实际数据的位置。

现在我已经为我们特定的List子类编写了一个类,但我不得不逐个手动指定所有属性。但是,如果我可以编写一个转换器,将其视为普通对象,那么手动处理这些项目,我就是金色的。我甚至不在乎我是否最终复制了另一个班级的一半(甚至更多!)但我很乐意为这些案例制作一个可重复使用的转换器。但是,正如我所说,我找不到默认的转换器。

所以...谁知道那是哪里?

2 个答案:

答案 0 :(得分:15)

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

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

我没有找到一种方法(一种正确的方法或一种优雅的黑客方式)能够通过实体上的扩展自定义序列化执行通用契约序列化(例如:正常解析对象)(我假设您正试图这样做。

答案 1 :(得分:1)

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