【问题标题】:Newtonsoft - deserialize “1” as conditional bool property [duplicate]Newtonsoft - 将“1”反序列化为条件布尔属性[重复]
【发布时间】:2019-01-05 22:43:10
【问题描述】:

我有以下 JSON 对象:

  {
    "entity": "Customer",
    "id": "XXX",
    "isActive": "1",
    "createdTime": "2018-01-30T18:56:51+02:00",
    "updatedTime": "2019-01-05T02:15:17+02:00",

以及以下 DTO 类:

public class Customer
{
    public string Id { get; set; }
    public bool IsActive { get; set; }
    public DateTime CreatedTime { get; set; }
    public DateTime UpdatedTime { get; set; }
}

和反序列化代码:

        var jsonResponse = JObject.Parse(customerString);
        JToken array = jsonResponse["response_data"];
        List<Customer> result = (List<Customer>)array.ToObject(typeof(List<Customer>));

但我对IsActive 属性有疑问,因为 json 对象有 1 或 0 个值,但我想要布尔值。怎么写JsonSerializer来做呢?

【问题讨论】:

标签: c# json.net jsonserializer


【解决方案1】:

how to get newtonsoft to deserialize yes and no to booleanPete 提供的非常好的代码

public class JsonBooleanConverter : JsonConverter
{
    public override bool CanWrite { get { return false; } }

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
    throw new NotImplementedException();
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
    var value = reader.Value.ToString().ToLower().Trim();
    switch (value)
    {
        case "true":
        case "yes":
        case "y":
        case "1":
            return true;
    }
    return false;
}

public override bool CanConvert(Type objectType)
{
    if (objectType == typeof(Boolean))
    {
        return true;
    }
    return false;
}

}

用法:

var myObj = JsonConvert.DeserializeObject<T>(json, new JsonBooleanConverter())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 2020-03-03
    • 2018-06-26
    相关资源
    最近更新 更多