json.net中属性的自定义反序列化[重复]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了json.net中属性的自定义反序列化[重复]相关的知识,希望对你有一定的参考价值。
这个问题在这里已有答案:
我查询具有奇怪序列化模式的API。某些属性可能为null(不存在)或对象数组(默认),甚至只是一个对象。这取决于列表中有多少项。
{
persons: null
}
要么
{
persons: { name: "lastname1, firstname1" }
}
要么
{
persons: [{ name: "lastname1, firstname1" }, { name: "lastname2, firstname2" }]
}
现在我想用json.net反序列化它。但我不知道如何定义我的模型。当我将人员财产定义为List <Person>案例1和3时,反序列化罚款,但案例2失败;当我将其定义为Person时,案例1和2反序列化为罚款。最好的是,当我可以将其定义为人员列表并编写指示json.net正确反序列化的内容时。现在json.net有一些概念来拦截序列化和反序列化。解决这个问题的最佳方法是什么?
答案
我想,除了实现自定义转换器之外别无选择;
class CollectionConverter<T> : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return (objectType == typeof(List<T>));
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JToken token = JToken.Load(reader);
if (token.Type == JTokenType.Array)
{
return token.ToObject<List<T>>();
}
return new List<T> { token.ToObject<T>() };
}
public override bool CanWrite => false;
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException("There is no writing implemantation");
}
}
public class PersonList
{
[JsonConverter(typeof(CollectionConverter<Person>))]
public List<Person> Persons { get; set; }
}
将对象反序列化为集合;
var str = "{ persons: { name: "lastname1, firstname1" } }";
var obj = JsonConvert.DeserializeObject<PersonList>(str);
反序列化集合;
var str = "{ persons: [{ name: "lastname1, firstname1" },{ name: "lastname1, firstname1" }] }";
var obj = JsonConvert.DeserializeObject<PersonList>(str);
另一答案
您最初可以检查人员是否为空(== null)。
那么如果你使用的是json.net, 您可以使用检查人员是否为阵列
if(personsJsonParsed is JArray)
如果它不是JArray,那么就假设它是一个对象。
以上是关于json.net中属性的自定义反序列化[重复]的主要内容,如果未能解决你的问题,请参考以下文章