【问题标题】:Json.net serialize numeric properties as stringJson.net 将数字属性序列化为字符串
【发布时间】:2017-01-24 08:41:39
【问题描述】:

我正在使用 JsonConvert.SerializeObject 序列化模型对象。 服务器期望所有字段都是字符串。我的模型对象具有数字属性和字符串属性。我无法向模型对象添加属性。有没有办法像字符串一样序列化所有属性值?我必须只支持序列化,不支持反序列化。

【问题讨论】:

  • @CodeJoy:对我来说,这似乎很专注于 DataTable - 我看不出这些答案将如何帮助 OP。
  • 对不起@CodeJoy,但我在想一些“更自动”的东西,比如 ContractResolver 或类似的东西。我不想手动将我的模型对象转换为所有属性都为字符串的 JObject。我将使用此解决方案作为最后的资源,因为它有效。无论如何谢谢你的帮助!! ;)
  • @dbc 已经过测试,效果很好。完美!!

标签: c# json json.net


【解决方案1】:

即使是数字类型,您也可以提供自己的JsonConverter。我刚刚尝试过,它可以工作——它又快又脏,你几乎肯定想扩展它以支持其他数字类型(longfloatdoubledecimal 等)但它应该得到你去:

using System;
using System.Globalization;
using Newtonsoft.Json;

public class Model
{
    public int Count { get; set; }
    public string Text { get; set; }

}

internal sealed class FormatNumbersAsTextConverter : JsonConverter
{
    public override bool CanRead => false;
    public override bool CanWrite => true;
    public override bool CanConvert(Type type) => type == typeof(int);

    public override void WriteJson(
        JsonWriter writer, object value, JsonSerializer serializer)
    {
        int number = (int) value;
        writer.WriteValue(number.ToString(CultureInfo.InvariantCulture));
    }

    public override object ReadJson(
        JsonReader reader, Type type, object existingValue, JsonSerializer serializer)
    {
        throw new NotSupportedException();
    }
}

class Program
{
    static void Main(string[] args)
    {
        var model = new Model { Count = 10, Text = "hello" };
        var settings = new JsonSerializerSettings
        { 
            Converters = { new FormatNumbersAsTextConverter() }
        };
        Console.WriteLine(JsonConvert.SerializeObject(model, settings));
    }
}

【讨论】:

    猜你喜欢
    • 2013-07-09
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多