如何将小数序列化为字符串?

时间:2019-06-10 22:59:20

标签: json.net

众所周知,最好使用字符串格式来序列化十进制数字。 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仅替换自身。我也看不到在层次结构中进行迭代的方法。

1 个答案:

答案 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 ) );
    }


}