irpas技术客

私人工具集3——JSON组装类(C#)_gz_redAnt_c# 组装json

irpas 4700

子曰:“工欲善其事,必先利其器”

github地址:https://github.com/redAntCpp/CSharpTools

在处理web请求的时候,与数据打交道在所难免,常见的数据交互方式有 XML和JSON。在C# 中,XML有系统的帮助类,因此不再描述记录。这里分享一个自己无聊所写的Json构造类。

关于json的介绍可以参考:https://·/js/js_json_intro.asp

Json的本质是个字符串,按某种特定的规则组合起来(接下来假定所有传输的内容都为字符串)。我们可以顺着这个思路,把json的结构进行拆分一下。 假设我们的目的是组装这样的一个json:

{ "companyID": "15", "employees": [{ "firstName": "Bill", "lastName": "Gates" }, { "firstName": "123", "lastName": "Bush" }], "manager": [{ "salary": "6000", "age": "23" }, { "salary": "8000", "age": "26", "cars": ["Porsche", "BMW", "Volvo"] }], "cc": { "salary": "test", "age": "100" } 简单的Json元素

JSON元素可以分为 key,value两部分。组合起来就是:

"key":"value"

所以一个json元素类必须有两个元素:

class JsonElement { private string JValue; private string JsonKey = ""; }

然后在构造函数中,拼接出来我们的json元素:

public JsonElement(string key, string value) { this.Jkey = key; this.jsonValue = value; JElement = string.Format("\"{0}\":\"" + JValue + "\"", Jkey); }

最后使用innertext输出结构体的内容:

public string innerText { get { return this.tostring(); } } public string tostring() { return JElement; }

经过处理后我们得到的元素结构为 “key”:“value”。完成了第一步。

简单的Json文档

在一般的json的样子中,我们选择简单的一个目的组成简单的json文档:

{ "firstName": "132", "lastName": "Bush" }

简单的json文档可以由闭合的单括号跟多个json元素构成,于是我们可以这么做,新建一个json文档类,内容为多个json元素,多元素之间用逗号隔开,可以封装在add方法上:

class JsonDocument { string JDocument; public JsonDocument() { this.JDocument = ""; } public void add(JsonElement je) { if (JDocument == "") { this.JDocument = je.innerText; } else { this.JDocument = JDocument + "," + je.innerText; } } }

最后组成的json文档需要加上单括号,于是我们再输出内容时加上它

private string tostring() { return "{" + JDocument + "}"; } 简单的Json对象

先看一个简单的json对象

"cc": { "salary": "test", "age": "100" }

对比简单的json文档,这里多了一个key,于是我们可以在一个json文档的基础上,加上这个key,生成一个这样的对象:

class JsonObject { private string JObjectValue; private string Jkey; public JsonObject(string key,JsonDocument jd) { this.Jsonkey = key; this.innerText = jd.innerText; } } 简单的Json数组

先看一个简单的JSON数组:

["Porsche", "BMW", "Volvo"]

当然我们通常不这么直接用,一般我们会把key带上。变成简单的json对象。由于使用平凡,此定义没有沿用到JOSN对象中实现。

我们可以看到json数组的不同:

用[ ]封装而非{ }。可以是纯字符串,不一定是纯json文档或者json元素。可以装多种不同的数据结构。于是我们需要考虑不同数据结构的载入。因此借助容器List < T >实现。 //构造函数 "key":[value1,value2...] public JsonArray(string key, string[] ValueList) { this.Jkey = key; JstrArryList = new List<string>(ValueList);//将数组转为list } //构造函数"key":[josn1,json2...] public JsonArray(string key, JsonDocument[] ValueList) { this.Jkey = key; JArryList = new List<JsonDocument>(ValueList); } public JsonArray(string key) { this.Jkey = key; JArryList = new List<JsonDocument>(); JstrArryList = new List<string>(); } public JsonArray() { this.Jkey = ""; JArryList = new List<JsonDocument>(); JstrArryList = new List<string>(); }

输出时,遍历list中的元素,逐个输出:

public string tostring() { string StrValueList = ""; //输出json对象 if (JArryList != null && JArryList.Count != 0)//存在且元素个数为0 { for (int i = 0; i < JArryList.Count; i++) { StrValueList = StrValueList + JArryList[i].innerText + ","; } StrValueList = StrValueList.Remove(StrValueList.Length - 1, 1); } else if (JstrArryList != null && JstrArryList.Count != 0) //输出json数组字符串 { for (int i = 0; i < JstrArryList.Count; i++) { StrValueList = StrValueList + "\"" + JstrArryList[i] + "\"" + ","; } StrValueList = StrValueList.Remove(StrValueList.Length - 1, 1); } else { StrValueList = ""; } //分开解析 StrValueList = "[" + StrValueList + "]"; //2022年1月23日20:53:25 新增数组中key为空的情况 if (Jkey == "") { return StrValueList; } else { string temp = string.Format("\"{0}\":", Jkey); StrValueList = temp + StrValueList; return StrValueList; } } 组装复杂的JSON

现在使用刚刚写的类,组装开篇提到的JSON:

private void button5_Click(object sender, EventArgs e) { //1. 创建一个json元素 JsonElement companyID = new JsonElement("companyID", "15"); JsonArray employeesArry = new JsonArray("employees"); JsonDocument employeesdoc1 = new JsonDocument(); employeesdoc1.add(new JsonElement("firstName", "Bill")); employeesdoc1.add(new JsonElement("lastName", "Gates")); JsonDocument employeesdoc2 = new JsonDocument(); employeesdoc2.add(new JsonElement("firstName", "")); employeesdoc2.add(new JsonElement("lastName", "Bush")); employeesArry.add(employeesdoc1); employeesArry.add(employeesdoc2); JsonArray manager = new JsonArray("manager"); JsonDocument manager1 = new JsonDocument(); manager1.add(new JsonElement("salary", "6000")); manager1.add(new JsonElement("age", "23")); string[] carslist = { "Porsche", "BMW", "Volvo" }; JsonArray cars = new JsonArray("cars", carslist); JsonDocument manager2 = new JsonDocument(); manager2.add(new JsonElement("salary", "8000")); manager2.add(new JsonElement("age", "26")); manager2.add(cars); manager.add(manager1); manager.add(manager2); JsonDocument cc_txt = new JsonDocument(); cc_txt.add(new JsonElement("salary", "test")); cc_txt.add(new JsonElement("age", "100")); JsonObject jo = new JsonObject("cc", cc_txt); //组装一下总体的文档 JsonDocument jd = new JsonDocument(); jd.add(companyID); jd.add(employeesArry); jd.add(manager); jd.add(jo); //输出文档 textBox1.Text = jd.innerText; }

代码有点长,但是思路很清晰,通常我们遇到的json不会如此复杂,作为工具是非常不错的,以此记录过程。


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #C #组装json #net功能工具集JSON组装类