自定义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"
}
这里最主要的是,我有一个开放的文件,我流的序列化对象到文件我收到他们。给我这个格式如上所示。当试图反序列化这样的对象时,我得到一个错误,因为它基本上期望它是一个数组。
以这种方式实现连续序列化的最佳方法是什么?
理想情况下,如果我可以做一些自定义序列化,我开始在开头写入“[”到文件末尾(和逗号在每个对象之间),然后消费应用程序可以反序列化成数组。我该怎么做呢?
答
基于由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("]");
}
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
太棒了!这真的很有帮助! – 2014-09-02 20:38:31