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中属性的自定义反序列化[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Json反序列化受保护的属性[重复]

Json.NET 反序列化或序列化 json 字符串并将属性映射到运行时定义的不同属性名称

使用JSON.NET实现对象属性的自定义化格式

使用 Json.NET 转换器反序列化属性

Json.net反序列化不反序列化所有属性

MVC 返回json数据 怎么忽略序列化某个属性