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

我正在使用Json.NET进行我正在进行的项目。 从外部API,我接收的JSON具有作为对象的属性,但是当它们为空时,传递“false”。

例如:

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

也可能是:

 data: { supplier: false } 

我应该如何定义供应商属性,以便将供应商反序列化为Supplier对象或为null。

现在我有:

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

下面是转换器运行的演示。 请注意,该演示假定您具有某种类型的data属性包含对象,因为您问题中的JSON不能独立存在。 RootObject ,我定义了一个名为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(json); DumpSupplier(obj.Data.Supplier); json = @" { ""data"": { ""supplier"": false } }"; Console.WriteLine("--- second run ---"); obj = JsonConvert.DeserializeObject(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)