【问题标题】:Why does JSON serialization return a partially deserialized object?为什么 JSON 序列化会返回部分反序列化的对象?
【发布时间】:2014-09-04 13:34:09
【问题描述】:

我有这个方法:

public Specification RequestUnit(string jsonString)
{
    var obj = JsonConvert.DeserializeObject<SkuModel>(jsonString.Replace("on", "1"));
    return inteService.RequestSpecification(obj);
}

而且,这是我的 JSON,正是包含在 jsonString

中的内容
{
"RequestStatus":"on",
"IsActive":"on",
"Code":"g87",
"Name":"fg8907",
"UnitDescription":"8gf"
}

不幸的是,出于某种未知的原因,obj 变量仅被部分设置。除了 UnitDescription(保持为空)之外的所有参数都已成功反序列化。我正在使用 Newtonsoft.Json JsonConvert 类。

有人吗?

【问题讨论】:

    标签: c# json serialization json.net converter


    【解决方案1】:

    这个问题的原因是这样的:

    jsonString.Replace("on", "1")
    

    Replace() 方法将替换每次出现的“on”。因此,您的实际 JSON 将是这样的:

    {
        "RequestStatus":"1",
        "IsActive":"1",
        "Code":"g87",
        "Name":"fg8907",
        "UnitDescripti1":"8gf"
    }
    

    注意UnitDescripti1 姓名。

    解决方法将使用

    jsonString.Replace("\"on\"", "\"1\"")
    

    但最好配置反序列化过程或使用自定义 JsonConverter,因为您可能会再次遇到相同的问题。

    【讨论】:

    • 哈哈,不敢相信我没看到 :) 谢谢,实际上应该是这样的: var obj = JsonConvert.DeserializeObject(skuModel.Replace("\"on\" ", "\"1\""));
    【解决方案2】:

    作为@Eldar mentions,您可以为bool 值使用自定义JsonConverter。这样做可能比尝试替换 JSON 字符串中的某些值更安全。

    public class BooleanOnOffConverter : JsonConverter
    {
        public override void WriteJson(
            JsonWriter writer,
            object value,
            JsonSerializer serializer)
        {
            writer.WriteValue((bool)value ? "on" : "off");
        }
    
        public override object ReadJson(
            JsonReader reader, 
            Type objectType, 
            object existingValue, 
            JsonSerializer serializer)
        {
            return reader.Value.ToString() == "on";
        }
    
        public override bool CanConvert(Type objectType)
        {
            return objectType == typeof(bool);
        }
    }
    

    用法:

    SkuModel deserialized = 
        JsonConvert.DeserializeObject<SkuModel>(jsonString, new BooleanOnOffConverter());
    

    【讨论】:

      猜你喜欢
      • 2017-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-01
      相关资源
      最近更新 更多