私人工具集3——Json组装类(JsonHelper)
子曰:“工欲善其事,必先利其器”
github地址: https:// github.com/redAntCpp/CS harpTools
在处理web请求的时候,与数据打交道在所难免,常见的数据交互方式有 XML和JSON。在C# 中,XML有系统的帮助类,因此不再描述记录。这里分享一个自己无聊所写的JOSN构造类。(PS,JSON解析类暂时没有想到好的办法,有兴趣的朋友可以谈谈自己的想法)
关于json的介绍可以参考:
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
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;
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);
StrValueList = "";
//分开解析
StrValueList = "[" + StrValueList + "]";
//2022年1月23日20:53:25 新增数组中key为空的情况
if (Jkey == "")
return StrValueList;
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);