JSON.Net Seralize值没有引号

时间:2014-02-13 21:12:49

标签: .net json format json.net

以下代码:

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

                                                       });

Seralizes一个json(string)对象:

  

{   “fooA”:0,   “fooB”:0,   “fooC”:假的,   “民以食为天”:假的,   “fooE”:0,   “fooF”:0,   }

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

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

1 个答案:

答案 0 :(得分:3)

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

如果你想要所有原语的引号,你有几个选择:

  1. 将要序列化的对象的属性更改为string类型。
  2. 将您的值放入Dictionary<string, string>(或DTO)并将其序列化。
  3. 制作自定义JsonConverter进行转化。此选项的优势在于它可以全局应用,因此您无需更改所有课程。
  4. 前两个选项非常明显。如果您选择使用转换器,代码可能如下所示:

    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"}