[英]Serialize byte array in JSON.NET without $type
我想使用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=="
}
是否可以使用$ type排除字節數組的JSON.NET序列化所有對象? 我可以在不向合同添加任何屬性的情況下執行此操作(即我只想更改序列化程序設置)。
解決此問題的一種方法是使用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=="
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.