IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 私人工具集3——JSON组装类 -> 正文阅读

[大数据]私人工具集3——JSON组装类

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

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

  1. 用[ ]封装而非{ }。
  2. 可以是纯字符串,不一定是纯json文档或者json元素。
  3. 可以装多种不同的数据结构。
  4. 于是我们需要考虑不同数据结构的载入。因此借助容器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不会如此复杂,作为工具是非常不错的,以此记录过程。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-02-07 13:47:24  更:2022-02-07 13:48:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 12:48:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码