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”时尝试反序列化时,它将失败. 我希望有人知道如何做到这一点.谢谢. 解决方法
这可以通过为您的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) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |