Json.NET自定义序列化与JsonConverter - 如何获得“默认”行为

17

我有一个用于我的类DataType的JsonConverter。 当纯字符串被用作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 dataType = serializer.Deserialize(reader);

会导致无限递归。

这能否轻松地完成?(不需要手动逐个属性进行)


当您尝试反序列化时,可能会跳过一些步骤。请查看此处https://dev59.com/bGsz5IYBdhLWcg3wQFUq - Andreea Dumitru
1个回答

16

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

限制:

示例演示代码


DefaultConvert() 调用在 Newtonsoft.Json.Serialization.JsonSerializerInternalReader.DeserializeConvertable(JsonConverter converter, JsonReader reader, Type objectType, Object existingValue) 抛出 NRE 异常。我将其替换为直接的构造函数调用……除此之外,感谢您的回答! - j_maly
@j_maly - 我也遇到了同样的问题,但是根据你的评论我无法找到解决方案。你能否发布你对这个答案所做的修改? - Suraj
@dbc - 感谢您发布那个fiddle。看起来您仍在调用DefaultCreator()。像j_maly一样,我在DefaultCreator()上遇到了NullReferenceException异常。j_maly说“我用直接构造函数调用替换了它”,但我无法理解他/她的意思。我正在寻找替换/修复以解决NullReferenceException问题的方法。 - Suraj
@dbc - 我的类型没有公共无参构造函数。我有一个自定义的合同解析器。我也知道,如果我的JsonConverter对CanConvert返回false,那么json.net可以使用自定义的合同解析器反序列化该类型。这是否打开了任何选项? - Suraj
@SFun28 - 看起来应该是可以实现的,但是你的情况与这个问题中的情况有所不同,我需要看到一个 [mcve]。也许你可以提出另一个问题? - dbc
显示剩余3条评论

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