我已将我的 Newtonsoft.Json 版本从“8.0.3”更新到“9.0.1”, 更改后,我开始面临一些 double 和字符串之间的转换问题。
这是一些代码:
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);
}
在 Newtonsoft.Json 版本“8.0.3”中 - 类的输出为: 关键测试” 值 - "210001"//没有 .0
在 Newtonsoft.Json 版本“9.0.1”中,类的输出为 关键测试” 值 - “210001.0”
只有当值为 210001.0 时才会发生这种情况 - 对于 210001.1 则不会发生。 现在我明白新版本更好地解决了这个问题,但是我有很多依赖于旧版本解决方案的外部代码。 我怎样才能实现旧版本的解决方案?
最佳答案
肯定有效的解决方案是将自定义 JsonConverter
应用于属性,这将使您能够控制值的序列化/反序列化方式。
第一步是创建一个新的JsonConverter
,实现起来非常简单。我只是对值调用 ToString()
,它可以是 decimal
或 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);
}
}
我这样做是为了让它可以处理 FloatParseHandling
的两个值,并且它将按照我在之前的错误答案中给出的格式设置值的格式。你当然可以根据自己的喜好调整它,如果你想让它忽略 FloatParseHandling
但它需要类型检查才能做到这一点。
请记住,FloatParseHandling
的默认值为 FloatParseHandling.Double
,因此无需更改序列化程序设置即可正常工作。
接下来您需要做的是用适当的属性标记该属性,以便序列化程序知道要使用它。
[JsonConverter(typeof(FloatStringConverter))]
public string Value { get; set; }
在此之后,Value
将包含来自 JSON 的正确数字表示。
关于c# - Newtonsoft.Json.net中double和string之间的转换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39593315/