众所周知,最好使用字符串格式来序列化十进制数字。 https://stackoverflow.com/a/38357877/4805491
许多服务将十进制值作为字符串发送,并且Json.NET
将其反序列化很好。
但是我找不到如何用字符串格式序列化十进制?
我应该为所有十进制数字自定义JsonConverter
吗?还是有一些方法可以利用默认的Json.NET
机会?
已更新
我需要通过此测试。
因此,我需要在以下时间或之后将所有十进制值替换为字符串值
JToken.FromObject( ... )
被调用。
var json = await Client.RequestJsonAsync( desc, default );
var obj = json.ToObject<MyObject>();
var json2 = JToken.FromObject( obj );
Assert.IsTrue( JToken.DeepEquals( json, json2 ), "Jsons are not equal" );
不幸的是,没有(或者我找不到)方法可以全部替换层次结构中的所有节点。 JToken.Replace
仅替换自身。我也看不到在层次结构中进行迭代的方法。
答案 0 :(得分:0)
public static JToken FromObject(object obj) {
var settings = new JsonSerializerSettings();
settings.Converters.Add( new DecimalToStringConverter() );
var serializer = JsonSerializer.CreateDefault( settings );
return JToken.FromObject( obj, serializer );
}
public class DecimalToStringConverter : JsonConverter {
public override bool CanRead => false;
public override bool CanWrite => true;
public override bool CanConvert(Type type) {
return type == typeof( decimal ) || type == typeof( decimal? );
}
public override object ReadJson(JsonReader reader, Type type, object existingInstance, JsonSerializer serializer) {
throw new NotImplementedException();
}
public override void WriteJson(JsonWriter writer, object instance, JsonSerializer serializer) {
var number = (decimal) instance;
writer.WriteValue( number.ToString( CultureInfo.InvariantCulture ) );
}
}