gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:10:49 33 4
gpt4 key购买 nike

我的类 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/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com