在Json.net中将数字字段反序列化为字符串时的格式问题

时间:2013-12-24 04:39:35

标签: json.net

当我尝试将json数字字段转换为C#字符串字段时,出现以下格式问题:

Json格式:

{"a":-7.0}

对应的C#类:

public class JsonReport
{
 public string a {get;set;}
}

当我打电话给方法时:

var obj=JsonConvert.DeserializeObject<JsonReport>(strContent);

我希望obj.a为“-7.0”,但结果是“-7”,这不是我想要的,我应该设置什么来修复这个问题?感谢。

2 个答案:

答案 0 :(得分:0)

将您的json对象传递为字符串

{"a":"-7.0"}

更改您的C#类

public class JsonReport
{
   public string a {get;set;}
}

答案 1 :(得分:0)

如果您有这样的十进制值,通常最好等到最后一刻 - 也就是说,就在您要将值显示给最终用户之前 - 在将其格式化为字符串之前。等待为您提供最大的灵活性来处理价值;您可以使用它进行计算,或者决定针对不同的显示进行不同的格式化。所以我的建议是将a类中的JsonReport属性更改为doubledecimal(取决于您的需要),然后在以后格式化值你准备好输出了它。

所有这一切,如果您真的想在反序列化期间将十进制值格式化为字符串,您可以使用自定义JsonConverter执行此操作。这可能是它的样子:

class FloatToStringConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(string);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JToken value = JToken.Load(reader);
        if (value.Type == JTokenType.Float)
        {
            // Adjust the formatting to your requirements
            return value.ToObject<double>().ToString("0.0#######;-0.0#######");
        }
        return value.ToString();
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

要使用转换器,请使用JsonConverter属性修饰要格式化的类属性,如下所示:

public class JsonReport
{
    [JsonConverter(typeof(FloatToStringConverter))]
    public string a { get; set; }
}

然后你可以正常反序列化:

var obj = JsonConvert.DeserializeObject<JsonReport>(strContent);
Console.WriteLine(obj.a);

输出:

-7.0