自定义JSON.net序列化和反序列化

问题描述:

我正在将数据写入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

基于由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("]"); 
       }