json.net中属性的自定义反序列化[重复]

问题描述 投票:1回答:2

我查询具有奇怪序列化模式的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有一些概念来拦截序列化和反序列化。解决这个问题的最佳方法是什么?

c# .net json serialization json.net
2个回答
0
投票

我想,除了实现自定义转换器之外别无选择;

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);

0
投票

您最初可以检查人员是否为空(== null)。

那么如果你使用的是json.net, 您可以使用检查人员是否为阵列

if(personsJsonParsed is JArray)

如果它不是JArray,那么就假设它是一个对象。

© www.soinside.com 2019 - 2024. All rights reserved.