我正在将Json.NET用于正在进行的项目。从外部API,我正在接收具有对象属性的JSON,但是当它们为空时,将传递’false’。
例如:
data: { supplier: { id: 15, name: 'TheOne' } }
也可能是:
data: { supplier: false }
我应该如何定义供应商属性,以便将供应商反序列化为供应商对象或为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。
我希望有人知道该怎么做。谢谢。
这可以通过JsonConverter为您的SupplierData班级定做来解决。这是转换器的外观:
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类是这样的:
[JsonConverter]
Supplier
Data
public class Data { [JsonProperty("supplier")] [JsonConverter(typeof(SupplierDataConverter))] public SupplierData Supplier { get; set; } }
下面是运行中的转换器的演示。请注意,该演示假定您具有该data属性的某种包含对象,因为问题中的JSON不能独立存在。我RootObject为此定义了一个类:
data
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)