子曰:“工欲善其事,必先利其器”
github地址:https://github.com/redAntCpp/CSharpTools
在处理web请求的时候,与数据打交道在所难免,常见的数据交互方式有 XML和JSON。在C# 中,XML有系统的帮助类,因此不再描述记录。这里分享一个自己无聊所写的Json构造类。
关于json的介绍可以参考:https://www.w3school.com.cn/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 >实现。
public JsonArray(string key, string[] ValueList)
{
this.Jkey = key;
JstrArryList = new List<string>(ValueList);
}
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 = "";
if (JArryList != null && JArryList.Count != 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)
{
for (int i = 0; i < JstrArryList.Count; i++)
{
StrValueList = StrValueList + "\"" + JstrArryList[i] + "\"" + ",";
}
StrValueList = StrValueList.Remove(StrValueList.Length - 1, 1);
}
else
{
StrValueList = "";
}
StrValueList = "[" + StrValueList + "]";
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)
{
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不会如此复杂,作为工具是非常不错的,以此记录过程。
|