C#解析json文件的实现代码
c# 解析 json
json(全称为javascript object notation) 是一种轻量级的数据交换格式。它是基于javascript语法标准的一个子集。 json采用完全独立于语言的文本格式,可以很容易在各种网络、平台和程序之间传输。json的语法很简单,易于人阅读和编写,同时也易于机器解析和生成。
json与xml的比较
◆可读性
json和xml的可读性相比较而言,由于xml提供辅助的标签,更加适合人阅读和理解。
◆文件大小与传输
xml允许使用方便的标签,所以文件尺寸是要比json大的。而且json源于javascript,所以天生的主战场是javascript与网络,在这里,json有着xml无法赶超的优势。
json语法
1. json 语法是 javascript 对象表示法语法的子集。
•数据在名称/值对中:名称是字符串,使用双引号表示。值可以是:数字(整数或浮点数),字符串(在双引号中),数组(在方括号中),对象(在花括号中),true/false/null。
•数据由逗号分隔:
•花括号保存对象:对象可以包含各种数据,包括数组。
•方括号保存数组:数字可以包含对象。
例如:
{
"employees": [
{
"firstname": "bill",
"lastname": "gates"
},
{
"firstname": "george",
"lastname": "bush"
}
]
}
2. 如果json中含有转义字符,则需要转义。例如文件路径中需要使用"\\"而不是"\"。例如:{ "file":"c:\\a.txt"}。
.net操作json
json文件读入到内存中就是字符串,.net操作json就是生成与解析json字符串。操作json通常有以下几种方式:
1. 原始方式:自己按照json的语法格式,写代码直接操作json字符串。如非必要,应该很少人会走这条路,从头再来的。
2. 通用方式【★★★★★】:
这种方式是使用开源的类库newtonsoft.json(下载地址http://json.codeplex.com/)。下载后加入工程就能用。通常可以使用jobject, jsonreader, jsonwriter处理。这种方式最通用,也最灵活,可以随时修改不爽的地方。
(1)使用jsonreader读json字符串:
string jsontext = @"{""input"" : ""value"", ""output"" : ""result""}";
jsonreader reader = new jsontextreader(new stringreader(jsontext));
while (reader.read())
{
console.writeline(reader.tokentype + "\t\t" + reader.valuetype + "\t\t" + reader.value);
}
(2)使用jsonwriter写字符串:
stringwriter sw = new stringwriter();
jsonwriter writer = new jsontextwriter(sw);
writer.writestartobject();
writer.writepropertyname("input");
writer.writevalue("value");
writer.writepropertyname("output");
writer.writevalue("result");
writer.writeendobject();
writer.flush();
string jsontext = sw.getstringbuilder().tostring();
console.writeline(jsontext);
(3)使用jobject读写字符串:
jobject jo = jobject.parse(jsontext);
string[] values = jo.properties().select(item => item.value.tostring()).toarray();
(4)使用jsonserializer读写对象(基于jsonwriter与jsonreader):
数组型数据
string jsonarraytext1 = "[{'a':'a1','b':'b1'},{'a':'a2','b':'b2'}]";
jarray ja = (jarray)jsonconvert.deserializeobject(jsonarraytext1);
string ja1a = ja[1]["a"].tostring();
//或者
jobject o = (jobject)ja[1];
string oa = o["a"].tostring();
嵌套格式
string jsontext = "{\"beijing\":{\"zone\":\"海淀\",\"zone_en\":\"haidian\"}}";
jobject jo = (jobject)jsonconvert.deserializeobject(jsontext);
string zone = jo["beijing"]["zone"].tostring();
string zone_en = jo["beijing"]["zone_en"].tostring();
自定义类project
project p = new project() { input = "stone", output = "gold" };
jsonserializer serializer = new jsonserializer();
stringwriter sw = new stringwriter();
serializer.serialize(new jsontextwriter(sw), p);
console.writeline(sw.getstringbuilder().tostring());
stringreader sr = new stringreader(@"{""input"":""stone"", ""output"":""gold""}");
project p1 = (project)serializer.deserialize(new jsontextreader(sr), typeof(project));
console.writeline(p1.input + "=>" + p1.output);
上面的代码都是基于下面这个project类定义:
class project
{
public string input { get; set; }
public string output { get; set; }
}
此外,如果上面的jsontextreader等类编译不过的话,说明是我们自己修改过的类,换成你们自己的相关类就可以了,不影响使用。
3. 内置方式:使用.net framework 3.5/4.0中提供的system.web.script.serialization命名空间下的javascriptserializer类进行对象的序列化与反序列化,很直接。
project p = new project() { input = "stone", output = "gold" };
javascriptserializer serializer = new javascriptserializer();
var json = serializer.serialize(p);
console.writeline(json);
var p1 = serializer.deserialize<project>(json);
console.writeline(p1.input + "=>" + p1.output);
console.writeline(referenceequals(p,p1));
注意:如果使用的是vs2010,则要求当前的工程的target framework要改成.net framework 4,不能使用client profile。当然这个system.web.extensions.dll主要是web使用的,直接在console工程中用感觉有点浪费资源。
此外,从最后一句也可以看到,序列化与反序列化是深拷贝的一种典型的实现方式。
4. 契约方式:使用system.runtime.serialization.dll提供的datacontractjsonserializer或者 jsonreaderwriterfactory实现。
project p = new project() { input = "stone", output = "gold" };
datacontractjsonserializer serializer = new datacontractjsonserializer(p.gettype());
string jsontext;
using (memorystream stream = new memorystream())
{
serializer.writeobject(stream, p);
jsontext = encoding.utf8.getstring(stream.toarray());
console.writeline(jsontext);
}
using (memorystream ms = new memorystream(encoding.utf8.getbytes(jsontext)))
{
datacontractjsonserializer serializer1 = new datacontractjsonserializer(typeof(project));
project p1 = (project)serializer1.readobject(ms);
console.writeline(p1.input + "=>" + p1.output);
}
这里要注意,这里的project类和成员要加相关的attribute:
[datacontract]
class project
{
[datamember]
public string input { get; set; }
[datamember]
public string output { get; set; }
}
实用参考:
json验证工具:
json简明教程:
newtonsoft.json类库下载: