Mar*_*man 22 c# serialization json json.net
我正在使用Json.NET进行我正在进行的项目.从外部API,我接收的JSON具有作为对象的属性,但是当它们为空时,传递"false".
例如:
data: {
supplier: {
id: 15,
name: 'TheOne'
}
}
Run Code Online (Sandbox Code Playgroud)
也可能是:
data: {
supplier: false
}
Run Code Online (Sandbox Code Playgroud)
我应该如何定义供应商属性,以便将供应商反序列化为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; }
}
Run Code Online (Sandbox Code Playgroud)
但是现在当供应商的值为'false'时尝试反序列化时,它会失败.当JSON值为"false"时,我希望Supplier属性为null.
我希望有人知道如何做到这一点.谢谢.
Bri*_*ers 32
这可以通过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);
}
}
Run Code Online (Sandbox Code Playgroud)
要使用它,您需要做的就是在类中为[JsonConverter]属性添加一个属性,如下所示:SupplierData
public class Data
{
[JsonProperty("supplier")]
[JsonConverter(typeof(SupplierDataConverter))]
public SupplierData Supplier { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
下面是转换器运行的演示.请注意,该演示假定您拥有某种data属性的包含对象,因为您问题中的JSON不能独立存在.我定义了一个RootObject为此目的而调用的类:
public class RootObject
{
[JsonProperty("data")]
public Data Data { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
实际的演示代码如下:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
以下是上述输出:
--- first run ---
Id: 15
Name: TheOne
--- second run ---
(null)
Run Code Online (Sandbox Code Playgroud)