我已将Newtonsoft.Json的版本从“ 8.0.3”更新为“ 9.0.1”,更改之后,我开始遇到一些在双打和字符串之间转换的问题。
这是一些代码:
public class KeyValue
{
public string Key { get; set; }
public string Value { get; set; }
}
private void button1_Click(object sender, EventArgs e)
{
var json = "{\"Key\": 'test', \"Value\": 210001.0}";
var kv = JsonConvert.DeserializeObject<KeyValue>(json);
}
Run Code Online (Sandbox Code Playgroud)
在Newtonsoft.Json版本“ 8.0.3”中,该类的输出为:键-“测试”值-“ 210001” //否.0
在Newtonsoft.Json版本“ 9.0.1”中,该类的输出为键-“测试”值-“ 210001.0”
仅当值是210001.0时才会发生-对于210001.1则不会发生。现在,我知道新版本可以更好地解决此问题,但是我有很多依赖于旧版本解决方案的外部代码。如何获得旧版本的解决方案?
肯定有效的解决方案是将自定义应用于JsonConverter属性,这将使您可以控制值的序列化/反序列化方式。
第一步是创建一个新的JsonConverter,实现起来非常简单。我只是调用ToString()该值,该值可以是 adecimal或double。
public sealed class FloatStringConverter : JsonConverter
{
public override bool CanWrite { get { return false; } }
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotSupportedException();
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
return reader.Value.ToString();
}
public override bool CanConvert(Type objectType)
{
return objectType == typeof(double) || objectType == typeof(decimal);
}
}
Run Code Online (Sandbox Code Playgroud)
我这样做是为了它可以使用 的两个值,FloatParseHandling并且它将格式化这些值,正如我在之前的错误答案中提出的那样。如果您希望它忽略,您当然可以根据自己的喜好对其进行调整,FloatParseHandling但需要进行类型检查才能执行此操作。
请记住,默认值为FloatParseHandling,FloatParseHandling.Double因此无需更改序列化器设置即可正常工作。
接下来您需要做的是使用适当的属性标记属性,以便序列化程序知道使用它。
[JsonConverter(typeof(FloatStringConverter))]
public string Value { get; set; }
Run Code Online (Sandbox Code Playgroud)
之后,Value将包含 JSON 中数字的正确表示形式。
| 归档时间: |
|
| 查看次数: |
2777 次 |
| 最近记录: |