加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何使用Json.NET反序列化可以是两种不同数据类型的JSON属

发布时间:2020-12-15 03:57:37 所属栏目:百科 来源:网络整理
导读:我正在使用Json.NET进行一个项目. 从外部API中,我接收到具有属性的对象的 JSON,但是当它们为空时,将传递“false”. 例如: data: { supplier: { id: 15,name: 'TheOne' }} 也可以: data: { supplier: false} 我应该如何定义供应商的属性,以便供应商反序列化
我正在使用Json.NET进行一个项目.
从外部API中,我接收到具有属性的对象的 JSON,但是当它们为空时,将传递“false”.

例如:

data: {
    supplier: {
        id: 15,name: 'TheOne'
    }
}

也可以:

data: {
    supplier: false
}

我应该如何定义供应商的属性,以便供应商反序列化为供应商对象或为空.

现在我有:

public class Data {
   [JsonProperty("supplier")]
   public SupplierData Supplier { get; set; }
}
public class SupplierData {
    [JsonProperty("id")]
    public int Id { get; set; }
    [JsonProperty("name")]
    public string Name { get; set; }
}

但是现在,当供应商的值为“false”时尝试反序列化时,它将失败.
当JSON值为“false”时,我希望Supplier属性为null.

我希望有人知道如何做到这一点.谢谢.

解决方法

这可以通过为您的SupplierData类制定自定义 JsonConverter来解决.这是转换器的外观:
class SupplierDataConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return (objectType == typeof(SupplierData));
    }

    public override object ReadJson(JsonReader reader,Type objectType,object existingValue,JsonSerializer serializer)
    {
        JToken token = JToken.Load(reader);
        if (token.Type == JTokenType.Object)
        {
            return token.ToObject<SupplierData>();
        }
        return null;
    }

    public override void WriteJson(JsonWriter writer,object value,JsonSerializer serializer)
    {
        serializer.Serialize(writer,value);
    }
}

要使用它,您需要做的就是将[JsonConverter]属性添加到Data类中的Supplier属性,如下所示:

public class Data
{
    [JsonProperty("supplier")]
    [JsonConverter(typeof(SupplierDataConverter))]
    public SupplierData Supplier { get; set; }
}

以下是转换器的演示.请注意,演示假设您有某种数据属性的包含对象,因为您的问题中的JSON不能独立存在.为此定义了一个名为RootObject的类:

public class RootObject
{
    [JsonProperty("data")]
    public Data Data { get; set; }
}

实际演示代码如下:

class Program
{
    static void Main(string[] args)
    {
        string json = @"
        {
            ""data"": 
            {
                ""supplier"": 
                {
                    ""id"": 15,""name"": ""TheOne""
                }
            }
        }";

        Console.WriteLine("--- first run ---");
        RootObject obj = JsonConvert.DeserializeObject<RootObject>(json);
        DumpSupplier(obj.Data.Supplier);

        json = @"
        {
            ""data"": 
            {
                ""supplier"": false
            }
        }";

        Console.WriteLine("--- second run ---");
        obj = JsonConvert.DeserializeObject<RootObject>(json);
        DumpSupplier(obj.Data.Supplier);
    }

    static void DumpSupplier(SupplierData supplier)
    {
        if (supplier != null)
        {
            Console.WriteLine("Id: " + supplier.Id);
            Console.WriteLine("Name: " + supplier.Name);
        }
        else
        {
            Console.WriteLine("(null)");
        }
        Console.WriteLine();
    }
}

这里是上面的输出:

--- first run ---
Id: 15
Name: TheOne

--- second run ---
(null)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读