当前位置: 移动技术网 > IT编程>开发语言>c# > c#版json数据解析示例分享

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

2019年07月18日  | 移动技术网IT编程  | 我要评论

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网