2012-02-18 32 views
16

Tôi có một lớp đơn giản với các tài sản sau đây:Serialize/Deserialize một mảng byte trong JSON.NET

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

nhưng điều này không hoạt động khi tôi cư thuộc tính với một hình ảnh và chuyển qua http Ảnh. Điều này nghe có vẻ giống như một câu hỏi đơn giản nhưng tôi vẫn chưa tìm được giải pháp sau khi tìm kiếm trực tuyến trong nhiều giờ, nhưng, làm cách nào để nối tiếp/deserialise một mảng byte trong Json.NET? Tôi cần thẻ thuộc tính nào, hoặc, tôi có nên làm theo cách khác không? Rất cám ơn!

+2

Bạn đã tìm thấy cách để đặt thuộc tính của đối tượng chính xác chưa? Thông tin có phần bị phân mảnh. Tôi đang tìm một giải pháp sạch cho cùng một vấn đề. 'byte []' phải được chuyển thành mảng, không phải chuỗi. –

+0

Tôi nghĩ rằng JSON.NET có vấn đề với mảng cố định chiều dài khi bạn bảo tồn tài liệu tham khảo và nhập thông tin. Khi bảo quản tên kiểu trong thành viên "$ type", nó ném một lỗi trong khi cố gắng deserialize một mảng có độ dài cố định hoặc chỉ đọc. Bạn phải sử dụng 'List ' thay vào đó, hoặc sử dụng một JsonConverter để tuần tự hóa thành viên byte []. Nó thực sự cần phải được sửa chữa, bởi vì nó không nên có vấn đề với những thứ cơ bản như vậy. – Triynko

Trả lời

6

Bạn có thể chuyển đổi các byte [] vào một chuỗi sau đó sử dụng phương pháp JsonConvert để có được những đối tượng:

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

Hãy cảnh giác với việc sử dụng phương pháp này cho các đối tượng lớn vì bạn sẽ nhận được Ngoại lệ OutOfMemory. Các phương thức sử dụng Stream (s) sẽ được trang bị tốt hơn để xử lý các kịch bản OutOfMemory. – Francis

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

Tôi thích câu trả lời này, nhưng bạn có thể muốn ném một đối số 'Encoding.UTF8' vào đối số thứ hai của hàm tạo' StreamReader'. Tôi luôn có chút băn khoăn về việc sử dụng mã hóa mặc định. – dana

+1

Đã cập nhật đoạn mã để có 'Encoding.UTF8' –

3

Nếu bạn đang sử dụng LINQ to JSON, bạn có thể làm điều này:

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

Kết quả sẽ là động JObject.

Mặc dù điều này có thể không chính xác là những gì OP đang tìm kiếm, nhưng nó có thể hữu ích cho những người khác đang tìm cách loại bỏ một số byte[] gặp phải câu hỏi này.