【问题标题】:How to serialize decimal as string?如何将十进制序列化为字符串?
【发布时间】:2019-10-25 07:58:12
【问题描述】:

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

【问题讨论】:

标签: json.net


【解决方案1】:
    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 ) );
    }


}

【讨论】:

    猜你喜欢
    • 2020-02-05
    • 2011-08-25
    • 2014-04-28
    • 1970-01-01
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    相关资源
    最近更新 更多