我有这个方法:
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());