簡體   English   中英

在沒有$ type的JSON.NET中序列化字節數組

[英]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=="
}

示例: https //dotnetfiddle.net/iDEPIT

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM