【问题标题】:Serialize byte array in JSON.NET without $type在没有 $type 的 JSON.NET 中序列化字节数组
【发布时间】:2015-06-12 19:11:01
【问题描述】:

我想使用 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 序列化所有对象,不包括字节数组?我可以在不向合约添加任何属性的情况下执行此操作吗(即我只想更改序列化程序设置)。

【问题讨论】:

  • @Hexxagonal:这不是 OP 的要求
  • 也许json 想让你知道它是在mscorlib 中定义的byte[]。不确定
  • @Hexxagonal:这不是那个问题的重复。

标签: c# json serialization json.net


【解决方案1】:

解决此问题的一种方法是使用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

【讨论】:

  • 这很快!我必须承认我惊呆了……非常聪明。它确实工作得很好。
  • @KarolKolenda:谢谢!很高兴为您提供帮助
猜你喜欢
  • 2011-02-08
  • 2012-03-09
  • 1970-01-01
  • 2013-02-17
  • 2017-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多