您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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

这可以通过JsonConverter为您的supplierData班级定做来解决。这是转换器的外观:

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]属性supplier你的财产Data类是这样的:

public class Data
{
    [JsonProperty("supplier")]
    [JsonConverter(typeof(supplierDataConverter))]
    public supplierData supplier { get; set; }
}

下面是运行中的转换器的演示。请注意,该演示假定您具有该data属性的某种包含对象,因为问题中的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)
dotnet 2022/1/1 18:19:55 有279人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶