我正在使用Json.NET进行一个项目.
从外部API中,我接收到具有属性的对象的 JSON,但是当它们为空时,将传递“false”.
从外部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)