为什么JSON序列化会返回部分反序列化的对象?

时间:2014-09-04 13:34:09

标签: c# json serialization json.net converter

我有这个方法:

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.Json JsonConvert类。

任何人

2 个答案:

答案 0 :(得分:5)

这个问题的原因是:

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

Replace()方法将取代&#34; on&#34;的每一次出现。所以,你的实际JSON将是这样的:

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

注意UnitDescripti1名称。

解决方法将使用

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

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

答案 1 :(得分:2)

作为@Eldar mentions,您可以为JsonConverter值使用自定义bool。这样做可能比尝试替换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());