覆盖Newtonsoft.Json单个序列化

时间:2015-11-08 08:55:33

标签: javascript c# json serialization json.net

我正在服务器和客户端上对序列化对象进行哈希处理以比较更改。在服务器上,我使用javascript JSON.stringify。在客户端,我使用JsonSerializer.JsonSerialize。要使哈希匹配,渲染的json必须在两侧都相同。

其中一个字段是javascript中的数字和.net中的单个字段。在javascript中,它序列化为"duration": 1。在.net中,它序列化为"duration": 1.0。这当然会使哈希不匹配。

如何在没有尾随零的情况下将.net序列化?

1 个答案:

答案 0 :(得分:1)

您可以使用自定义JsonConverter来控制浮动的格式。您需要对其进行测试以确保格式与您期望的值范围匹配,但这应该非常接近。

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

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        writer.WriteRawValue(((float)value).ToString("0.########"));
    }

    public override bool CanRead
    {
        get { return false; }
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

JsonConvert.SerializeObject有一个接受JsonConverter的重载,使其非常简单易用:

string json = JsonConvert.SerializeObject(yourObject, new FormattedFloatConverter());

小提琴:https://dotnetfiddle.net/3t6RiR