为什么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,你可以再次得到了同样的问题。
答
由于@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());
哈哈,不容相信我没有看到它:)谢谢,它实际上应该是这样的:var OBJ = JsonConvert.DeserializeObject(skuModel.Replace(” \“on \”“,”\“1 \”“)); –
Marcus
2014-09-04 13:58:54