欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

c#版json数据解析示例分享

程序员文章站 2024-02-23 19:53:16
json与xml的比较◆可读性json和xml的可读性相比较而言,由于xml提供辅助的标签,更加适合人阅读和理解。◆文件大小与传输xml允许使用方便的标签,所以文件尺寸是要...

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; }