以下代码:
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)。
如果您希望在所有基元周围加上引号,您有以下几种选择:
- 将要序列化的对象的属性更改为类型
string
。 - 将值放入
Dictionary<string, string>
(或 DTO)中并对其进行序列化。 - 创建自定义
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"}