JSON.Net Seralize 值没有引号



以下代码:

var json = JsonConvert.SerializeObject(fooObject,
                                                   new JsonSerializerSettings
                                                       {
                                                           NullValueHandling = NullValueHandling.Ignore,
                                                       });

将以下内容的 json(字符串)对象Seral化:

{ "fooA":0, "fooB":0, "fooC":假, "fooD":假, "fooE":0, "fooF":0, }

这些值不在引号中,例如"fooA":"0"。这就是我想要的行为。

有没有办法强制执行此行为?

在 JSON 格式中,数字和布尔值周围没有引号,而字符串有(见 JSON.org)。

如果您希望在所有基元周围加上引号,您有以下几种选择:

  1. 将要序列化的对象的属性更改为类型 string
  2. 将值放入Dictionary<string, string>(或 DTO)中并对其进行序列化。
  3. 创建自定义JsonConverter进行转换。 此选项的优点是它可以全局应用,这样您就不必更改所有类。

前两个选项是不言自明的。如果您选择使用转换器,代码可能如下所示:

class PrimitiveToStringConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType.IsPrimitive;
    }
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        writer.WriteValue(value.ToString().ToLower());
    }
    public override bool CanRead
    {
        get { return false; }
    }
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

若要使用它,只需将转换器的实例传递给 JsonConvert.SerializeObject 方法。

string json = JsonConvert.SerializeObject(foo, new PrimitiveToStringConverter());

演示:

class Program
{
    static void Main(string[] args)
    {
        Foo foo = new Foo
        {
            Int = 6,
            Bool = true,
            Float = 3.14159
        };
        string json = JsonConvert.SerializeObject(foo, new PrimitiveToStringConverter());
        Console.WriteLine(json);
    }
}
class Foo
{
    public int Int { get; set; }
    public bool Bool { get; set; }
    public double Float { get; set; }
}

输出:

{"Int":"6","Bool":"true","Float":"3.14159"}

相关内容

  • 没有找到相关文章

最新更新