我想使用TypeNameHandling.Objects序列化所有与$ type引用的契约。但是,使用此标志时,所有字节数组(byte [])都使用$ value + $ type序列化。我仍然想要Base64编码,但没有$ type。例如,对于以下合同:
class MyClass
{
public byte[] MyBinaryProperty {get;set;}
}
我明白了:
{
"$type": "MyLib.MyClass, MyAssembly",
"MyBinaryProperty": {
"$type": "System.Byte[], mscorlib",
"$value": "VGVzdGluZw=="
}
}
我想:
{
"$type": "MyLib.MyClass, MyAssembly",
"MyBinaryProperty": "VGVzdGluZw=="
}
是否可以通过JSON.NET使用$ type排除字节数组来序列化所有对象?我可以在不向合同添加任何属性的情况下执行此操作(即,我只想更改序列化程序设置)。
答案 0 :(得分:4)
解决此问题的一种方法是为byte[]
使用自定义转换器:
public class ByteArrayConverter : JsonConverter
{
public override object ReadJson(
JsonReader reader,
Type objectType,
object existingValue,
JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override void WriteJson(
JsonWriter writer,
object value,
JsonSerializer serializer)
{
string base64String = Convert.ToBase64String((byte[])value);
serializer.Serialize(writer, base64String);
}
public override bool CanRead
{
get { return false; }
}
public override bool CanConvert(Type t)
{
return typeof(byte[]).IsAssignableFrom(t);
}
}
这样你就可以覆盖byte[]
序列化的方式,并最终传递序列化程序string
而不是字节数组。
以下是您使用它的方式:
string serialized = JsonConvert.SerializeObject(mc, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Objects,
Formatting = Newtonsoft.Json.Formatting.Indented,
Converters = new[] { new ByteArrayConverter() }
});
示例输出:
{
"$type": "UserQuery+MyClass, query_fajhpy",
"MyBinaryProperty": "AQIDBA=="
}