2012-02-18 118 views
16

我有以下属性的简单类:序列化/反序列化的字节数组中JSON.NET

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

但是当我填充的图像和传输通过HTTP照片财产这不起作用。 这可能听起来像一个简单的问题,但我在网上查找几个小时后仍未找到解决方案,但是,如何在Json.NET中对字节数组进行序列化/反序列化?我需要哪些属性标签,或者,我应该以另一种方式来做这件事吗? 非常感谢!

+2

您是否找到了设置正确对象属性的方法?信息有些分散。我正在为完全相同的问题寻找一个干净的解决方案。 'byte []'应该被转换为一个数组,而不是一个字符串。 – 2013-02-26 07:19:55

+0

我认为当你保存引用和类型信息时,JSON.NET有固定长度数组的问题。在“$ type”成员中保留类型名称时,它会在尝试反序列化固定长度或只读数组时引发错误。您必须改用'List ',或使用JsonConverter来序列化byte []成员。它确实需要修复,因为它不应该有这样的基本问题。 – Triynko 2013-12-03 20:36:55

回答

6

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

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

对大型对象使用此方法时要小心,因为您将获得OutOfMemory异常。使用Stream的方法可以更好地处理OutOfMemory场景。 – Francis 2017-08-09 08:40:03

13
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; 
} 
+4

我喜欢这个答案,但是你可能想在'StreamReader'构造函数的第二个参数中引入'Encoding.UTF8'参数。我总是对使用默认编码有点怀疑。 – dana 2015-07-13 23:10:28

+1

更新了片段以使'Encoding.UTF8' – 2017-01-22 12:58:10

3

如果您正在使用LINQ to JSON,你可以这样做:

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

结果将是一个动态的JObject。虽然这可能不是OP期望做到的,但它可能适用于其他人试图反序列化遇到此问题的byte[]