在JSON.NET中序列化/反序列化一个字节数组

Ste*_*all 29 c# serialization json json.net

我有一个带有以下属性的简单类:

[JsonObject(MemberSerialization.OptIn)]
public class Person
{
    ...
    [JsonProperty(PropertyName = "Photograph"]
    public byte[] Photograph { get; set; }
    ...
}
Run Code Online (Sandbox Code Playgroud)

但是当我使用图像填充Photograph属性并通过http传输时,这不起作用.这可能听起来像一个简单的问题,但我在网上看了几个小时后还没有找到解决方案,但是,我如何在Json.NET中序列化/反序列化一个字节数组?我需要什么属性标签,或者,我应该采用另一种方式吗?非常感谢!

Ale*_*rev 30

public static T Deserialize<T>(byte[] data) where T : class
{
    using (var stream = new MemoryStream(data))
    using (var reader = new StreamReader(stream, Encoding.UTF8))
        return JsonSerializer.Create().Deserialize(reader, typeof(T)) as T;
}
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这个答案,但你可能想把一个`Encoding.UTF8`参数放到`StreamReader`构造函数的第二个参数中.我总是对使用默认编码有点怀疑. (4认同)
  • 另外,提到的方法来自Newtonsoft.Json (2认同)

Oli*_*ver 16

您可以将byte []转换为字符串,然后使用JsonConvert方法获取对象:

var bytesAsString = Encoding.UTF8.GetString(bytes);
var person = JsonConvert.DeserializeObject<Person>(bytesAsString);
Run Code Online (Sandbox Code Playgroud)

  • 对于大型对象使用此方法时要小心,因为您会遇到 OutOfMemory 异常。使用 Stream(s) 的方法可以更好地处理内存不足的情况。 (3认同)

dan*_*ana 5

如果您使用LINQ to JSON,则可以执行以下操作:

JObject.Parse(Encoding.UTF8.GetString(data));
Run Code Online (Sandbox Code Playgroud)

结果将是动态的JObject.

虽然这可能不是OP想要做的事情,但对于那些希望对byte[]这个问题进行反序列化的人来说,它可能会派上用场.