Json操作库DynamicJson使用指南
Json的简介
JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。
Json的优点
- 数据格式比较简单,易于读写,格式都是压缩的,占用带宽小
- 易于解析,客户端JavaScript可以简单的通过eval()进行JSON数据的读取;
- 支持多种语言,包括ActionScript,C,C#,ColdFusion,Java,JavaScript,Perl,PHP,Python,Ruby等服务器端语言,便于服务器端的解析;
- 在PHP世界,已经有PHP-JSON和JSON-PHP出现了,偏于PHP序列化后的程序直接调用,PHP服务器端的对象、数组等能直接生成JSON格式,便于客户端的访问提取;
- 因为JSON格式能直接为服务器端代码使用,大大简化了服务器端和客户端的代码开发量,且完成任务不变,并且易于维护。
传统操作Json
很多.NET开发程序员或多或少都会遇到操作Json字符串的情况,一般来说,我们都是先定义一个和Json格式相匹配的类,然后将json字符串反序列化成对象,这样便于我们编程使用,由于.NET是强类型语言,Json又是多变的,非常灵活的,导致服务器端定义的json序列化类越来越多,操作也及其不便。特别是对多层嵌套的json更是头疼。此次不再过多声明,.NET程序员用过都明白。
简易操作Json
DynamicJson是专门为.NET程序员开发的Json操作库,其源码非常简单,仅仅只有400行代码,一个对应的class类,目前只支持.NET4.0以上的.NETFramework。
如何在项目中使用DynamicJson
直接通过Nuget安装
PM>Install-PackageDynamicJson
下载DynamicJson.dll,然后在项目中添加引用,下载地址如下:
http://dynamicjson.codeplex.com/
读取、获取
//将Json字符串解析成DynamicJson对象
varjson=DynamicJson.Parse(@"{""foo"":""json"",""bar"":100,""nest"":{""foobar"":true}}");
varr1=json.foo;//"json"-string类型
varr2=json.bar;//100-double类型
varr3=json.nest.foobar;//true-bool类型
varr4=json["nest"]["foobar"];//还可以和javascript一样通过索引器获取
判断,新增,更新,删除,替换,还可以输出新的Json字符串
//将Json字符串解析成DynamicJson对象
varjson=DynamicJson.Parse(@"{""foo"":""json"",""bar"":100,""nest"":{""foobar"":true}}");
//判断json字符串中是否包含指定键
varb1_1=json.IsDefined("foo");//true
varb2_1=json.IsDefined("foooo");//false
//上面的判断还可以更简单,直接通过json.键()就可以判断
varb1_2=json.foo();//true
varb2_2=json.foooo();//false;
//新增操作
json.Arr=newstring[]{"NOR","XOR"};//新增一个js数组
json.Obj1=new{};//新增一个js对象
json.Obj2=new{foo="abc",bar=100};//初始化一个匿名对象并添加到json字符串中
//删除操作
json.Delete("foo");
json.Arr.Delete(0);
//还可以更简单去删除,直接通过json(键);即可删除。
json("bar");
json.Arr(1);
//替换操作
json.Obj1=5000;
//创建一个新的JsonObject
dynamicnewjson=newDynamicJson();
newjson.str="aaa";
newjson.obj=new{foo="bar"};
//直接序列化输出json字符串
varjsonstring=newjson.ToString();//{"str":"aaa","obj":{"foo":"bar"}}
遍历
//直接遍历json数组
vararrayJson=DynamicJson.Parse(@"[1,10,200,300]");
foreach(intiteminarrayJson)
{
Console.WriteLine(item);//1,10,200,300
}
//直接遍历json对象
varobjectJson=DynamicJson.Parse(@"{""foo"":""json"",""bar"":100}");
foreach(KeyValuePair<string,dynamic>iteminobjectJson)
{
Console.WriteLine(item.Key+":"+item.Value);//foo:json,bar:100
}
转换和反序列化
publicclassFooBar
{
publicstringfoo{get;set;}
publicintbar{get;set;}
}
vararrayJson=DynamicJson.Parse(@"[1,10,200,300]");
varobjectJson=DynamicJson.Parse(@"{""foo"":""json"",""bar"":100}");
//将json数组转成C#数组
//方法一:
vararray1=arrayJson.Deserialize<int[]>();
//方法二
vararray2=(int[])arrayJson;
//方法三,这种最简单,直接声明接收即可,推荐使用
int[]array3=arrayJson;
//将json字符串映射成C#对象
//方法一:
varfoobar1=objectJson.Deserialize<FooBar>();
//方法二:
varfoobar2=(FooBar)objectJson;
//方法三,这种最简单,直接声明接收即可,推荐使用
FooBarfoobar3=objectJson;
//还可以通过Linq进行操作
varobjectJsonList=DynamicJson.Parse(@"[{""bar"":50},{""bar"":100}]");
varbarSum=((FooBar[])objectJsonList).Select(fb=>fb.bar).Sum();//150
vardynamicWithLinq=((dynamic[])objectJsonList).Select(d=>d.bar);
序列化成json字符串
//声明一个匿名对象
varobj=new
{
Name="Foo",
Age=30,
Address=new
{
Country="Japan",
City="Tokyo"
},
Like=new[]{"Microsoft","Xbox"}
};
//序列化
//{"Name":"Foo","Age":30,"Address":{"Country":"Japan","City":"Tokyo"},"Like":["Microsoft","Xbox"]}
varjsonStringFromObj=DynamicJson.Serialize(obj);
//还支持直接序列化数组,集合
//[{"foo":"fooooo!","bar":1000},{"foo":"orz","bar":10}]
varfoobar=newFooBar[]{
newFooBar{foo="fooooo!",bar=1000},
newFooBar{foo="orz",bar=10}
};
//序列化
varjsonFoobar=DynamicJson.Serialize(foobar);
其他(冲突问题,编译不通过问题)
varnestJson=DynamicJson.Parse(@"{""tes"":10,""nest"":{""a"":0}");
nestJson.nest();//判断是否存在nest属性
nestJson.nest("a");//删除nest属性中的a属性
//处理json中的键和C#的类型冲突导致编译失败,或语法提示错误,只需要在前面加@前缀即可
varjson=DynamicJson.Parse(@"{""int"":10,""event"":null}");
varr1=json.@int;//10.0
varr2=json.@event;//null
例子一:TwitterAPI
staticvoidMain()
{
varpublicTL=newWebClient().DownloadString(@"http://twitter.com/statuses/public_timeline.json");
varstatuses=DynamicJson.Parse(publicTL);
foreach(varstatusinstatuses)
{
Console.WriteLine(status.user.screen_name);
Console.WriteLine(status.text);
}
}
例子二:TwitterAPI2
staticvoidMain(string[]args)
{
varwc=newWebClient();
varstatuses=Enumerable.Range(1,5)
.Select(i=>
wc.DownloadString("http://twitter.com/statuses/user_timeline/neuecc.json?page="+i))
.SelectMany(s=>(dynamic[])DynamicJson.Parse(s))
.OrderBy(j=>j.id);
foreach(varstatusinstatuses)
{
Console.WriteLine(status.text);
}
}
看到这里,是不是觉得很爽,赶快让你的项目集成DynamicJson吧。