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

时间:2012-02-18 00:19:40

标签: c# json serialization json.net

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

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

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

4 个答案:

答案 0 :(得分:26)

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;
}

答案 1 :(得分:15)

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

var bytesAsString = Encoding.UTF8.GetString(bytes);
var person = JsonConvert.DeserializeObject<Person>(bytesAsString);

答案 2 :(得分:5)

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

JObject.Parse(Encoding.UTF8.GetString(data));

结果将是动态JObject

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

答案 3 :(得分:0)

根据 this 的回答,您可以在 net core 中使用以下一个:

using System.IO;
using System.Text.Json;
using System.Threading.Tasks;

namespace <MyNameSpace>
{
    public static class ByteArrayExtensions
    {
        public static async Task<T> Deserialize<T>(this byte[] data) where T : class
        {
            using (var stream = new MemoryStream(data))
            {
                return await JsonSerializer.DeserializeAsync(stream, typeof(T)) as T;
            }
        }
    }
}

可能被认为在可读性方面具有优势:

var Deserialized = await mySerializedByteArray.Deserialize<MyObjectClass>();