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

问题描述:

我有这样的方法:为什么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(保留为空)以外的所有参数都被成功反序列化。我正在使用Newtonsoft.Json JsonConvert类。

有人吗?

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

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

Replace()方法将取代“开”每一次出现。因此,您的实际JSON将如下所示:

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

注意UnitDescripti1名称。

的解决方法将使用

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

但它是更好地配置您反序列化过程或使用自定义JsonConverter,你可以再次得到了同样的问题。

+1

哈哈,不容相信我没有看到它:)谢谢,它实际上应该是这样的:var OBJ = JsonConvert.DeserializeObject (skuModel.Replace(” \“on \”“,”\“1 \”“)); – Marcus 2014-09-04 13:58:54

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