C# 在JSON.NET中序列化字节数组而不使用$type
我想使用typenameholling.Objects用$type引用序列化我的所有合同。但是,使用此标志时,所有字节数组(字节[])都使用$value+$type进行序列化。我仍然需要Base64编码,但不需要$type。例如,对于以下合同:C# 在JSON.NET中序列化字节数组而不使用$type,c#,json,serialization,json.net,C#,Json,Serialization,Json.net,我想使用typenameholling.Objects用$type引用序列化我的所有合同。但是,使用此标志时,所有字节数组(字节[])都使用$value+$type进行序列化。我仍然需要Base64编码,但不需要$type。例如,对于以下合同: class MyClass { public byte[] MyBinaryProperty {get;set;} } 我得到: { "$type": "MyLib.MyClass, MyAssembly", "MyBinaryProper
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(不包括字节数组)序列化所有对象?我是否可以在不向协定添加任何属性的情况下执行此操作(即,我只想更改序列化程序设置)。解决此问题的一种方法是为
字节[]使用自定义转换器。
:
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 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=="
}
示例:@Hexxagonal:这不是OP要问的问题可能json
想让您知道它是mscorlib
中定义的字节[]
。不sure@Hexxagonal当前位置这不是那个问题的翻版。太快了!我必须承认我目瞪口呆。。。非常聪明。它确实工作得很好。@KarolKolenda:谢谢!很乐意帮忙