在Newtonsoft.Json.net中在双打和字符串之间转换问题

ole*_*kov 5 c# json.net

我已将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则不会发生。现在,我知道新版本可以更好地解决此问题,但是我有很多依赖于旧版本解决方案的外部代码。如何获得旧版本的解决方案?

kiz*_*ziu 4

肯定有效的解决方案是将自定义应用于JsonConverter属性,这将使您可以控制值的序列化/反序列化方式。

第一步是创建一个新的JsonConverter,实现起来非常简单。我只是调用ToString()该值,该值可以是 adecimaldouble

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但需要进行类型检查才能执行此操作。

请记住,默认值为FloatParseHandlingFloatParseHandling.Double因此无需更改序列化器设置即可正常工作。

接下来您需要做的是使用适当的属性标记属性,以便序列化程序知道使用它。

[JsonConverter(typeof(FloatStringConverter))]
public string Value { get; set; }
Run Code Online (Sandbox Code Playgroud)

之后,Value将包含 JSON 中数字的正确表示形式。