为什么JSON序列化返回一个部分反序列化的对象



我有这个方法:

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(保持为null)外的所有参数都已成功反序列化。我正在使用Newtonsoft.JsonJsonConvert类。

有人吗?

这个问题的原因是:

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

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

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

注意UnitDescripti1名称。

解决方法是使用

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

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

正如@Eldar提到的,您可以为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());

相关内容

  • 没有找到相关文章

最新更新