C# 如何使用JSON.NET反序列化可以是两种不同数据类型的JSON属性
我正在使用Json.NET进行一个项目。 从外部API,我接收的JSON的属性是对象,但当它们为空时,会传递“false” 例如:C# 如何使用JSON.NET反序列化可以是两种不同数据类型的JSON属性,c#,json,serialization,json.net,C#,Json,Serialization,Json.net,我正在使用Json.NET进行一个项目。 从外部API,我接收的JSON的属性是对象,但当它们为空时,会传递“false” 例如: data: { supplier: { id: 15, name: 'TheOne' } } 也可以是: data: { supplier: false } 我应该如何定义supplier属性,以便将供应商反序列化为supplier对象或null 现在我有: public class Data { [
data: {
supplier: {
id: 15,
name: 'TheOne'
}
}
也可以是:
data: {
supplier: false
}
我应该如何定义supplier属性,以便将供应商反序列化为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
我希望有人知道怎么做。谢谢。这可以通过为您的
供应商数据
类定制来解决。以下是转换器的外观:
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);
}
}
下面是变频器运行的演示。请注意,演示假定您拥有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();
}
}
您可以创建自定义JSON转换器并读取JSON。请参阅此链接:我有一个类似的例子,其中属性要么是对象,要么是空数组。对于一个API来说,在没有版本控制的情况下这样破坏是一个错误的决定,但这是一个足够干净的解决方案。谢谢我怎样才能两者兼得?我希望两者都转换为“供应商”:{“id”:15、“名称”:“TheOne”}和json=@“{”数据“:{”供应商“:false}”@Decoder94也许你可以发布一篇文章,详细告诉我们你想做什么?如果需要,您可以链接回此问题/答案以提供上下文。@BrianRogers
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)