使用JsonConverter进行Json.NET自定义序列化 - 如何获取"默认"行为

j_m*_*aly 10 c# serialization json json.net

我的类DataType有一个JsonConverter.当Json中使用的普通字符串作为DataType类型的属性值时,我想做一些特殊处理.在值是"完整"对象的情况下,我想进行"正常"反序列化.

这是我的尝试

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
    if (reader.Value != null && reader.ValueType == typeof (string))
    {
        return someSpecialDataTypeInstance;
    }
    else if (reader.TokenType == JsonToken.StartObject)
    {
        DataType dataType = serializer.Deserialize<DataType>(reader);
        return dataType;
    }
    else
    {
        throw new JsonSerializationException();
    }
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为这一行:DataType dataType = serializer.Deserialize(reader); 导致无限递归.

这可以轻易地完成吗?(无需手动逐个财产)

dbc*_*dbc 8

一种简单的方法是分配您的类的实例,然后使用JsonSerializer.Populate(JsonReader, Object)。这是在标准中完成的方式CustomCreationConverter<T>

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
    if (reader.Value != null && reader.ValueType == typeof(string))
    {
        return someSpecialDataTypeInstance;
    }
    else if (reader.TokenType == JsonToken.StartObject)
    {
        existingValue = existingValue ?? serializer.ContractResolver.ResolveContract(objectType).DefaultCreator();
        serializer.Populate(reader, existingValue);
        return existingValue;
    }
    else if (reader.TokenType == JsonToken.Null)
    {
        return null;
    }
    else
    {
        throw new JsonSerializationException();
    }
}
Run Code Online (Sandbox Code Playgroud)

局限性:

样品提琴