这个问题在这里已有答案:
我查询具有奇怪序列化模式的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,那么就假设它是一个对象。