2012-02-18 105 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[]