我正在对服务器和客户端上的序列化对象进行散列,以比较更改。在服务器上,我使用javascript JSON.stringify。在客户端上,我用JsonSerializer.JsonSerialize。为了匹配哈希,呈现的JSON必须在两侧相同。
其中一个字段是javascript中的数字和.net中的single。在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:https://dotnetfiddle.net/3t6RiR