c# - Newtonsoft.Json.net中double和string之间的转换问题

标签 c# json.net

我已将我的 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(),它可以是 decimaldouble

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/

相关文章:

c# - 将SqlDataReader写入立即窗口c#

c# - 如何使用 iTextSharp 在 pdf 中创建文本框?

json - 数据逐行而不是成批插入

c# - 序列化 JSON Dictionary<string, string>

c# - 为什么我的 winforms 秒表时间很慢?

c# - 使用两列之一将表连接到其他表

c# X509Certificate2 添加证书如何标记为可导出

c# - 无法使用 C# (NewtonSoft) 编辑 JSON,因为出现错误

c# - JSON.NET - 在运行时排除特定类型的属性

c# - 在反序列化过程中有选择地转义字符串中的 HTML