私人工具集3——Json组装类(JsonHelper)

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

github地址: github.com/redAntCpp/CS

在处理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数组的不同:

  1. 用[ ]封装而非{ }。
  2. 可以是纯字符串,不一定是纯json文档或者json元素。
  3. 可以装多种不同的数据结构。

于是我们需要考虑不同数据结构的载入。因此借助容器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);