C#之Json,从Json字符串到类代码

自从.net 4.0开始,微软提供了一整套的针对json进行处理的方案。其中,就有如何把json字符串转化成C#类对象,其实这段代码很多人都清楚,大家也都认识,我就不多说,先贴代码。

1、添加引用 System.Web.Extensions

2、测试一下代码

static class Program

{

/// <summary>

/// 程序的主入口点。

/// </summary>

static void Main()

{

string jsonStr = "{\"name\":\"supperlitt\",\"age\":25,\"likes\":[\"C#\",\"asp.net\"]}";

JavaScriptSerializer js = new JavaScriptSerializer();

var model = js.Deserialize<TestModel>(jsonStr);

Console.WriteLine(model.name);

Console.WriteLine(model.age);

Console.WriteLine(string.Join(",", model.likes));

Console.ReadLine();

}

public class TestModel

{

public string name { get; set; }

public int age { get; set; }

public List<string> likes { get; set; }

}

}

输出内容:

逆思考

  由于代码中,经常会遇到需要处理json字符串(抓包比较频繁)。每次遇到json字符串,大多需要解析,又要进行重复劳动,又需要定义一个C#对象类,有没有一个比较好的办法解决呢,不用每次都去写代码。自动生成多好。。。

  于是LZ思前,向后,想到了以前用过的一个微软的类库,应该是微软的一个Com库。

从json字符串自动生成C#类

1、试着百度了一下,也尝试了几个可以使用的类。于是找到了

如下的代码,能够解析一个json字符串,成为一个C#的对象。

1 Microsoft.JScript.Vsa.VsaEngine ve = Microsoft.JScript.Vsa.VsaEngine.CreateEngine();
2 var m = Microsoft.JScript.Eval.JScriptEvaluate("(" + jsonStr + ")", ve);

这里引用了,Microsoft.JScript.dll 类库。

2、发现这个m对象,其实是一个JSObject对象,内部也可以继续进行细分,于是测试了种种,稍后会上源码。先看测试效果吧。

  我们随便在web上面找了一个json字符串来进行处理。当然json要稍稍复杂一点。

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using Microsoft.JScript;
  6
  7 namespace Common
  8 {
  9     /// <summary>
 10     /// Json字符串zhuanh
 11     /// </summary>
 12     public class JsonHelper : IHelper
 13     {
 14         /// <summary>
 15         /// 是否添加get set
 16         /// </summary>
 17         private bool isAddGetSet = false;
 18
 19         /// <summary>
 20         /// 数据集合,临时
 21         /// </summary>
 22         private List<AutoClass> dataList = new List<AutoClass>();
 23
 24         public JsonHelper()
 25         {
 26         }
 27
 28         public JsonHelper(bool isAddGetSet)
 29         {
 30             this.isAddGetSet = isAddGetSet;
 31         }
 32
 33         /// <summary>
 34         /// 获取类的字符串形式
 35         /// </summary>
 36         /// <param name="jsonStr"></param>
 37         /// <returns></returns>
 38         public string GetClassString(string jsonStr)
 39         {
 40             Microsoft.JScript.Vsa.VsaEngine ve = Microsoft.JScript.Vsa.VsaEngine.CreateEngine();
 41             var m = Microsoft.JScript.Eval.JScriptEvaluate("(" + jsonStr + ")", ve);
 42
 43             int index = 0;
 44             var result = GetDicType((JSObject)m, ref index);
 45
 46             StringBuilder content = new StringBuilder();
 47             foreach (var item in dataList)
 48             {
 49                 content.AppendFormat("\tpublic class {0}\r\n", item.CLassName);
 50                 content.AppendLine("\t{");
 51                 foreach (var model in item.Dic)
 52                 {
 53                     if (isAddGetSet)
 54                     {
 55                         content.AppendFormat("\t\tpublic {0} {1}", model.Value, model.Key);
 56                         content.Append(" { get; set; }\r\n");
 57                     }
 58                     else
 59                     {
 60                         content.AppendFormat("\t\tpublic {0} {1};\r\n", model.Value, model.Key);
 61                     }
 62
 63                     content.AppendLine();
 64                 }
 65
 66                 content.AppendLine("\t}");
 67                 content.AppendLine();
 68             }
 69
 70             return content.ToString();
 71         }
 72
 73         /// <summary>
 74         /// 获取类型的字符串表示
 75         /// </summary>
 76         /// <param name="type"></param>
 77         /// <returns></returns>
 78         private string GetTypeString(Type type)
 79         {
 80             if (type == typeof(int))
 81             {
 82                 return "int";
 83             }
 84             else if (type == typeof(bool))
 85             {
 86                 return "bool";
 87             }
 88             else if (type == typeof(Int64))
 89             {
 90                 return "long";
 91             }
 92             else if (type == typeof(string))
 93             {
 94                 return "string";
 95             }
 96             else if (type == typeof(List<string>))
 97             {
 98                 return "List<string>";
 99             }
100             else if (type == typeof(List<int>))
101             {
102                 return "List<int>";
103             }
104             else
105             {
106                 return "string";
107             }
108         }
109
110         /// <summary>
111         /// 获取字典类型
112         /// </summary>
113         /// <returns></returns>
114         private string GetDicType(JSObject jsObj, ref int index)
115         {
116             AutoClass classInfo = new AutoClass();
117
118             var model = ((Microsoft.JScript.JSObject)(jsObj)).GetMembers(System.Reflection.BindingFlags.GetField);
119             foreach (Microsoft.JScript.JSField item in model)
120             {
121                 string name = item.Name;
122                 Type type = item.GetValue(item).GetType();
123                 if (type == typeof(ArrayObject))
124                 {
125                     // 集合
126                     string typeName = GetDicListType((ArrayObject)item.GetValue(item), ref index);
127                     if (!string.IsNullOrEmpty(typeName))
128                     {
129                         classInfo.Dic.Add(name, typeName);
130                     }
131                 }
132                 else if (type == typeof(JSObject))
133                 {
134                     // 单个对象
135                     string typeName = GetDicType((JSObject)item.GetValue(item), ref index);
136                     if (!string.IsNullOrEmpty(typeName))
137                     {
138                         classInfo.Dic.Add(name, typeName);
139                     }
140                 }
141                 else
142                 {
143                     classInfo.Dic.Add(name, GetTypeString(type));
144                 }
145             }
146
147             index++;
148             classInfo.CLassName = "Class" + index;
149             dataList.Add(classInfo);
150             return classInfo.CLassName;
151         }
152
153         /// <summary>
154         /// 读取集合类型
155         /// </summary>
156         /// <param name="jsArray"></param>
157         /// <param name="index"></param>
158         /// <returns></returns>
159         private string GetDicListType(ArrayObject jsArray, ref int index)
160         {
161             string name = string.Empty;
162             if ((int)jsArray.length > 0)
163             {
164                 var item = jsArray[0];
165                 var type = item.GetType();
166                 if (type == typeof(JSObject))
167                 {
168                     name = "List<" + GetDicType((JSObject)item, ref index) + ">";
169                 }
170                 else
171                 {
172                     name = "List<" + GetTypeString(type) + ">";
173                 }
174             }
175
176             return name;
177         }
178     }
179
180     public class AutoClass
181     {
182         public string CLassName { get; set; }
183
184         private Dictionary<string, string> dic = new Dictionary<string, string>();
185
186         public Dictionary<string, string> Dic
187         {
188             get
189             {
190                 return this.dic;
191             }
192             set
193             {
194                 this.dic = value;
195             }
196         }
197     }
198 }

调用方式:

按 Ctrl+C 复制代码

JsonHelper helper = new JsonHelper(true);
try
{
this.txtOutPut.Text = helper.GetClassString("json字符串");
}
catch
{
this.txtOutPut.Text = "输入内容不符合规范...";
}

按 Ctrl+C 复制代码

最后如果dudu允许的话,我再附上一个测试地址吧:http://www.51debug.com/tool/JsonToCharpCode.aspx

博客也写了几次了,不过每次都写得比较滥,看着不舒服,这次用心写了一下,欢迎大家拍砖或提供更好的建议。

时间: 2024-10-09 05:44:13

C#之Json,从Json字符串到类代码的相关文章

也谈C#之Json,从Json字符串到类代码

原文:也谈C#之Json,从Json字符串到类代码  阅读目录 json转类对象 逆思考 从json字符串自动生成C#类  json转类对象 自从.net 4.0开始,微软提供了一整套的针对json进行处理的方案.其中,就有如何把json字符串转化成C#类对象,其实这段代码很多人都清楚,大家也都认识,我就不多说,先贴代码. 1.添加引用 System.Web.Extensions 2.测试一下代码 1 static class Program 2 { 3 /// <summary> 4 ///

Freemarker输出json和java字符串以及javascript代码转义

Java 语言规则的字符串转义:${content?j_string} JavaScript 语言规则的字符串转义:${content?js_string} JSON 规则的字符串转义:${content?json_string} 文档:http://freemarker.org/docs/ref_builtins_string.html#ref_builtin_j_string

[转]C# 将类的内容写成JSON格式的字符串

将类的内容写入到JSON格式的字符串中 本例中建立了Person类,赋值后将类中内容写入到字符串中 运行本代码需要添加引用动态库Newtonsoft.Json 程序代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; //需要引用 Newtonsoft.Json.dll using Newtonsoft.Json

[转]C# JSON格式的字符串读取到类中

将JSON格式的字符串读取到类中 本例中建立JSON格式的字符串json,将其内容读取到Person类中 运行本代码需要添加引用动态库Newtonsoft.Json 程序代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; //需要引用 Newtonsoft.Json.dll using Newtonsoft.J

JavaScriptSerializer类 对象序列化为JSON,JSON反序列化为对象 。

JavaScriptSerializer 类由异步通信层内部使用,用于序列化和反序列化在浏览器和 Web 服务器之间传递的数据.说白了就是能够直接将一个C#对象传送到前台页面成为javascript对象.要添加System.Web.Extensions.dll的引用.该类位于System.Web.Script.Serialization命名空间下. 一.属性 MaxJsonLength 获取或设置 JavaScriptSerializer 类接受的 JSON 字符串的最大长度. Recursio

Java-封装生成JSON数据和XML数据类

1.背景 借鉴与php中 app接口的实现(php写app接口生成xml和json数据),封装了java版的json和xml数据操作类! 2.准备 在使用之前,需要引入 json 的jar 包:点我下载 ! 这里实现了,对象转json , 对象集合转json, 对象转xml,对象集合转xml ; 3.appUtil 工具类实现 具体的实现过程,我就不解释了,一边写,一边测试!直到写成为止! 里面的 tojsonArray() 方法 没有使用,可以删除,不过想生成json数组的 ,就不需要删除了!

MyBatis里json型字段到Java类的映射

一.简介 我们在用MyBatis里,很多时间有这样一个需求:bean里有个属性是非基本数据类型,在DB存储时我们想存的是json格式的字符串,从DB拿出来时想直接映射成目标类型,也即json格式的字段串字段与Java类的相互类型转换. 当然,你可以为每个类写一个MyClassTypeHandler,但问题是要为每个类都写一个TypeHandler,过于繁琐. 有了泛型,一个通用的TypeHandler直接搞定. 二.源码 package com.xxx.typehandler; import c

JavaScriptSerializer类 对象序列化为JSON,JSON反序列化为对象

JavaScriptSerializer 类由异步通信层内部使用,用于序列化和反序列化在浏览器和 Web 服务器之间传递的数据.说白了就是能够直接将一个C#对象传送到前台页面成为javascript对象.要添加System.Web.Extensions.dll的引用.该类位于System.Web.Script.Serialization命名空间下. 一.属性 MaxJsonLength 获取或设置 JavaScriptSerializer 类接受的 JSON 字符串的最大长度. Recursio

VB.NET 将JSON格式的字符串保存到XML文件中

1.关于本文 这几天打算写一个工具类JsonXmlHelper,用来进行用XML来保存JSON格式文件的工作.该工具类中要实现2个最主要的函数: 1)将JSON格式的内容写入到地址为address的XML中:WriteJsonToXml 2)把函数1中构造的XML文件恢复成JSON格式文档:RecoverJsonFromXml 函数1的实现将在本文中给出,函数2的实现将在以后发表的博文中给出 2.代码说明 1)添加引用:Newtonsoft.Json.dll 2)导入库 'JSON解析相关函数,