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

我正在将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班级定做来解决。这是转换器的外观:

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类是这样的:

public class Data

{

[JsonProperty("supplier")]

[JsonConverter(typeof(SupplierDataConverter))]

public SupplierData Supplier { get; set; }

}

下面是运行中的转换器的演示。请注意,该演示假定您具有该data属性的某种包含对象,因为问题中的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)

以上是 如何使用Json.NET反序列化可以是两种不同数据类型的JSON属性 的全部内容, 来源链接: utcz.com/qa/412059.html

回到顶部