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吧。