C# · 12月 27, 2021

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

我正在使用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: 15Name: TheOne— second run —(null)