Javascript 重写单个文件的Newtonsoft.Json序列化

Javascript 重写单个文件的Newtonsoft.Json序列化,javascript,c#,json,serialization,json.net,Javascript,C#,Json,Serialization,Json.net,我正在对服务器和客户端上的序列化对象进行散列,以比较更改。在服务器上,我使用javascript JSON.stringify。在客户端上,我使用JsonSerializer.JsonSerialize。为了匹配散列,呈现的json必须在两侧完全相同 其中一个字段是javascript中的数字和.net中的单个字段。在javascript中,它序列化为“duration”:1。在.net中,它序列化为“duration”:1.0。这当然会使散列无法匹配 如何让.net在没有尾随零的情况下序列化?

我正在对服务器和客户端上的序列化对象进行散列,以比较更改。在服务器上,我使用javascript JSON.stringify。在客户端上,我使用JsonSerializer.JsonSerialize。为了匹配散列,呈现的json必须在两侧完全相同

其中一个字段是javascript中的数字和.net中的单个字段。在javascript中,它序列化为
“duration”:1
。在.net中,它序列化为
“duration”:1.0
。这当然会使散列无法匹配


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

您可以使用自定义的
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());

Fiddle:

不要使用浮点类型?但持续时间可能是非整数值。