JSON.Net Seralize 值没有引号

Ran*_*ger -2 .net format json json.net

以下代码:

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

                                                       });
Run Code Online (Sandbox Code Playgroud)

序列化一个 json(字符串)对象:

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

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

有没有办法强制执行这种行为?

Bri*_*ers 7

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

如果您想在所有原语周围使用引号,您有几个选择:

  1. 将您正在序列化的对象的属性更改为类型string
  2. 将您的值放入 a 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

string json = JsonConvert.SerializeObject(foo, new PrimitiveToStringConverter());
Run Code Online (Sandbox Code Playgroud)

演示:

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; }
}
Run Code Online (Sandbox Code Playgroud)

输出:

{"Int":"6","Bool":"true","Float":"3.14159"}
Run Code Online (Sandbox Code Playgroud)

  • 您应该获得 *JsonConverter* 徽章。似乎你可以用它解决一切。 (2认同)