I'm using Json.NET for a project I'm working on. From an external API, I am receiving JSON with properties that are objects, but when they are empty 'false' is passed.

For example:

data: {
    supplier: {
        id: 15,
        name: 'TheOne'
    }
}

也可以是:

data: {
    supplier: false
}

How should I define the supplier property so that the supplier will be deserialized to a Supplier object or null.

Right now I have:

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; }
}

But now when trying to deserialize when supplier has a value of 'false' it fails. I would like the Supplier property to be null when the JSON value is 'false'.

I hope someone knows how to do this. Thanks.

推荐答案

这可以通过为您的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);
    }
}

要使用它,只需向Data类中的Supplier属性添加一个[JsonConverter]属性,如下所示:

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相关问答推荐

如何使用PlayWriter循环访问JSON对象

如何使用GoFr返回XML响应?

在Zig中解析JSON失败

将JSON数组组织到菜单中

如何用JQ打印JSON文件的路径和键值

nlohmann json:为什么我会得到一个解析错误?

使用 jq 如何更改键的值?

报告重复的对象键

jq :遍历 json 并在键存在时检索集合

JSON 的自定义编组器,可以是字符串或 map[string]string / map[string]bool

将请求中的数据推送到数组中

通过一个序列化器更新多个模型数据

使用基本身份验证通过 CURL 发布 JSON

如何在golang中获取 struct 的json字段名称?

JSON extract\set 的 SQLite JSON1 示例

使用 @ResponseBody 自定义 HttpMessageConverter 来做 Json 事情

如何使用 Jackson 定义可选的 json 字段

将错误消息作为 JSON 对象发送

使用 Retrofit 解析动态密钥 Json 字符串

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