2014-09-02 103 views
1

我正在將數據寫入JSON格式以供其他程序使用。我需要將大量的JSON對象序列化到一個文件中。使用JSON.net這實在是直線前進與以下幾行代碼連載:自定義JSON.net序列化和反序列化

[JsonConverter(typeof(SimpleClassSerializer))] 
public class SimpleClass 
{ 
    public string name; 
} 

SimpleClass obj1 = new SimpleClass { name="exampleObj1" }; 
string serialised = JsonConvert.SerializeObject(obj1, Formatting.Indented); 

給輸出:

{ 
    "name": "exampleObj1" 
} 

我實際上將多SimpleClass(例如類)對象和工作想要將它們全部序列化(因爲我收到它們)。

使用下面的示例代碼,這是好的和簡單,如果我有一個數組或列表:

SimpleClass[] arr1 = new SimpleClass[3]; 

SimpleClass obj1 = new SimpleClass { name="exampleObj1" }; 
SimpleClass obj2 = new SimpleClass { name = "exampleObj2" }; 
SimpleClass obj3 = new SimpleClass { name = "exampleObj3" }; 

arr1[0] = obj1; 
arr1[1] = obj2; 
arr1[2] = obj3; 

string serialised = JsonConvert.SerializeObject(arr1, Formatting.Indented); 

給我下面的輸出:

[ 
    { 
    "name": "exampleObj1" 
    }, 
    { 
    "name": "exampleObj2" 
    }, 
    { 
    "name": "exampleObj3" 
    } 
] 

這是很容易反序列化到一個數組。因爲我不知道我正在處理的對象的數量,並且由於內存約束(每個對象中的數據),所以我不能先聲明一個數組(例如string [] arr = new string [50000])。很大)。主要因爲內存限制,我也無法使用列表。

如果我做到以下幾點:

SimpleClass obj1 = new SimpleClass { name="exampleObj1" }; 
SimpleClass obj2 = new SimpleClass { name = "exampleObj2" }; 
SimpleClass obj3 = new SimpleClass { name = "exampleObj3" }; 

string serialised = JsonConvert.SerializeObject(obj1, Formatting.Indented); 
serialised += JsonConvert.SerializeObject(obj2, Formatting.Indented); 
serialised += JsonConvert.SerializeObject(obj3, Formatting.Indented); 

給我這個:

{ 
    "name": "exampleObj1" 
}{ 
    "name": "exampleObj2" 
}{ 
    "name": "exampleObj3" 
} 

這裏最主要的是,我有一個開放的文件,我流的序列化對象到文件我收到他們。給我這個格式如上所示。當試圖反序列化這樣的對象時,我得到一個錯誤,因爲它基本上期望它是一個數組。

以這種方式實現連續序列化的最佳方法是什麼?

理想情況下,如果我可以做一些自定義序列化,我開始在開頭寫入「[」到文件末尾(和逗號在每個對象之間),然後消費應用程序可以反序列化成數組。我該怎麼做呢?

+1

Json.net有一個JsonWriter和JsonSerializer。看到這個詹姆斯牛頓 - 金博客文章。 http://james.newtonking.com/archive/2009/02/14/writing-json-to-a-file-using-json-net – cgotberg 2014-09-02 20:19:25

+0

太棒了!這真的很有幫助! – 2014-09-02 20:38:31

回答

2

基於由cgotberg給我的信息(抱歉不似乎能夠標記爲答案註釋:-s)

這裏是解決辦法:

using (FileStream fs = File.Open(@"c:\temp\a.json", FileMode.Create)) 
    using (StreamWriter sw = new StreamWriter(fs)) 
      using (JsonWriter jw = new JsonTextWriter(sw)) 
       { 
        jw.Formatting = Formatting.Indented; 

        JsonSerializer serializer = new JsonSerializer(); 
        sw.Write("["); 
        serializer.Serialize(jw, obj1); 
        sw.Write(","); 
        serializer.Serialize(jw, obj2); 
        sw.Write(","); 
        serializer.Serialize(jw, obj3); 
        sw.Write("]"); 
       }