c# - 使用 JsonConverter 的 Json.NET 自定义序列化 - 如何获得 "default"行为

标签 c# json serialization 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();
    }
}

但这行不通,因为这一行: 数据类型 dataType = serializer.Deserialize(reader); 导致无限递归。

这能以某种方式轻松完成吗? (无需手动逐个属性)

最佳答案

一个简单的方法是分配一个类的实例,然后使用 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();
    }
}

限制:

样本 fiddle .

关于c# - 使用 JsonConverter 的 Json.NET 自定义序列化 - 如何获得 "default"行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35586987/

相关文章:

c# - 执行相同的方法消耗更少的时间

c# - 将静态方法附加到类而不是类实例的最佳方法是什么?

c# - json.NET 反序列化 2D 数组时抛出 InvalidCastException

javascript - 确定 JSON 数组中字符串的出现次数

powershell - Sitecore 序列化 Powershell

java - scala @Serializable 和 Java Serializable 有什么区别?

c# - 序列化有序集成员

c# - 在 .NET 中派生 COM 接口(interface)

c# - 如何在 2 个类(class)之间访问 1 个计时器?

sql - Postgres - 将行数据作为 JSON 数组或数组返回