当前位置: 首页 > 科技观察

另外说说C#中的Json,从Json字符串到类代码

时间:2023-03-13 19:26:47 科技观察

json到类对象从.net4.0开始,微软提供了一套完整的json处理解决方案。其中,有如何将json字符串转化为C#对象。其实这段代码很多人都知道,大家都知道。我就不多说了,先把代码贴出来。1.添加对System.Web.Extensions的引用2.测试代码staticclassProgram{///

///程序的主要入口点。///staticvoidMain(){stringjsonStr="{\"name\":\"supperlitt\",\"age\":25,\"likes\":[\"C#\",\"asp.net\"]}";JavaScriptSerializerjs=newJavaScriptSerializer();varmodel=js.Deserialize(jsonStr);Console.WriteLine(model.name);Console.WriteLine(model.age);Console.WriteLine(string.Join(",",model.likes));Console.ReadLine();}publicclassTestModel{publicstringname{get;set;}publicintage{get;set;}publicListlikes{get;set;}}}输出内容:逆向思维因为在代码中,经常需要处理json字符串(抓包比较频繁)。每次遇到json串,大部分都需要解析,重复劳动,需要定义一个C#对象类。有没有更好的办法不用每次都写代码来解决。能自动生成多好啊。..于是LZ前思后想,想到了一个自己之前用过的微软的类库,应该是微软的一个Com库。#p#自动从json字符串生成C#类1、百度一下,也试了几个能用的类。于是我找到了下面的代码,可以解析一个json字符串,变成一个C#对象。此处引用的是Microsoft.JScript.dll类库。Microsoft.JScript.Vsa.VsaEngineve=Microsoft.JScript.Vsa.VsaEngine.CreateEngine();varm=Microsoft.JScript.Eval.JScriptEvaluate("("+jsonStr+")",ve);2.找到这个m对象,其实是一个JSObject对象,内部还可以进一步细分,所以测试了各种类型,后面会上传源码。先来看看测试结果吧。我们在网上随便找了个json串来处理。当然json稍微复杂一点。ps:代码如下usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingMicrosoft.JScript;namespaceCommon{//////Json字符串zhuanh///publicclassJsonHelper:IHelper{//////添加getset///privateboolisAddGetSet=false;//////数据收集,临时///privateListdataList=newList();publicJsonHelper(){}publicJsonHelper(boolisAddGetSet){this.isAddGetSet=isAddGetSet;}//////获取类的字符串形式/////////publicstringGetClassString(stringjsonStr){Microsoft.JScript.Vsa.VsaEngineve=Microsoft.JScript.Vsa.VsaEngine.CreateEngine();varm=Microsoft。脚本。Eval.JScriptEvaluate("("+jsonStr+")",ve);intindex=0;varresult=GetDicType((JSObject)m,refindex);StringBuildercontent=newStringBuilder();foreach(varitemindataList){content.AppendFormat("\tpublicclass{0}\r\n",item.CLassName);content.AppendLine("\t{");foreach(varmodelinitem.Dic){if(isAddGetSet){content.AppendFormat("\t\tpublic{0}{1}",model.Value,model.Key);content.Append("{get;set;}\r\n");}else{content.AppendFormat("\t\tpublic{0}{1};\r\n",model.Value,model.Key);}content.AppendLine();}content.AppendLine("\t}");content.AppendLine();}returncontent.ToString();}//////获取类的字符串表示/////////privatestringGetTypeString(Typetype){if(type==typeof(int)){return"int";}elseif(type==typeof(bool)){return"bool";}elseif(type==typeof(Int64)){return"long";}elseif(type==typeof(string)){return"string";}elseif(type==typeof(List)){return"List";}elseif(type==typeof(List)){return"List///获取典型类型//////privatestringGetDicType(JSObjectjsObj,refintindex){AutoClassclassInfo=newAutoClass();varmodel=((Microsoft.JScript.JSObject)(jsObj)).GetMembers(System.Reflection.BindingFlags.GetField);foreach(Microsoft.JScript.JSFielditeminmodel){stringname=item.Name;Typetype=item.GetValue(item).GetType();if(type==typeof(ArrayObject)){//集合stringtypeName=GetDicListType((ArrayObject)item.GetValue(item),refindex);if(!string.IsNullOrEmpty(typeName)){classInfo.Dic.Add(name,typeName);}}elseif(type==typeof(JSObject)){//单个对象stringtypeName=GetDicType((JSObject)item.GetValue(item),refindex);if(!string.IsNullOrEmpty(typeName)){classInfo.Dic.Add(name,typeName);}}else{classInfo.Dic.Add(name,GetTypeString(type));}}index++;classInfo.CLassName="Class"+index;dataList.Add(classInfo);returnclassInfo.CLassName;}//////读取集合类型////////////privatestringGetDicListType(ArrayObjectjsArray,refintindex){stringname=string.空;if((int)jsArray.length>0){varitem=jsArray[0];vartype=item.GetType();if(type==typeof(JSObject)){name="List<"+GetDicType((JSObject)item,refindex)+">";}else{name="List<"+GetTypeString(type)+">";}}returnname;}}publicclassAutoClass{publicstringCLassName{get;set;}privateDictionarydic=newDictionary<字符串,字符串>();publicDictionaryDic{get{returnthis.dic;}set{this.dic=value;}}}}调用方法:JsonHelperhelper=newJsonHelper(true);try{this.txtOutPut.Text=helper.GetClassString("jsonstring");}catch{this.txtOutPut.Text="输入的内容不符合规范...";}***如果dudu允许,我会附上最后的测试地址:http://www.51debug.com/tool/JsonToCharpCode.aspx博客也写了好几遍,但是每次都写的比较多,看着不舒服,这次是用心写的,欢迎拍砖或者提供更好的建议