Json基础
提及JSON(JavaScript 对象表示法),作为一种数据交换格式,项目中客户端与服务端交互的时候频繁用到。说来惭愧,刚实习的时候,直接被派到政府里面去对接开发门户网站,没错,组长交代二句就飞到他处出差,当时我还没听过 Json、easyUI,独自坐在监控大厅那叫一个尴尬,手忙脚乱,惴惴不安。着实被鄙视了一番,窃以为耻。
如果说英语作为世界大部分国家交流的公用语言,那么JSon就算各平台主要进行交互的通用数据格式。毕竟还有部分土著部落交流适用的不是英语,诚然,Json也不是绝对的,XML数据格式也占有一席之地。日常用到的轻量级的数据交换格式,自认为接触的还算多,亦写了简洁版系列来对复杂XML日常使用说明的随笔。这里希望对JSON的一些基础知识进行梳理。
1.JSON语法
JSON 数据的格式为 名称:值 ,如 { "Name" :"Mark" } ,这里冒号左边部分为名称,用双引号包含。冒号右边为值,可表示 对象、字符串、数组、数字、布尔、null 六种类型。
表示多笔数据时,用 逗号区别,如 { "Name" :"Mark" , "Age":100 }
这里{ } 是读取的起始对象,
{
"Class" : "5",
[“Name” :"Mark" , "Age":15] ,
[“Name” :“Sientuo” , "Age":12]
}
如果拿到一组JSON数据,想要验证其写法是否正确,一般情况下,直接拷贝到在线网站上进行验证即可,毕竟这类网站非常多。
2. Json数据类型
JSon中的数据类型是针对值来定义的,这里的值是指JSON数据中《名称:值》 中的值,上面提到值有6中类型。下面一一来列举说明。
①对象:Json本身就是对象,用 { }包裹,如果其值为对象,肯定涉及到嵌套 ,再复杂的对象嵌套,只要理清层级关系,基础只是牢固,也不会是丈二的和尚。
{
"Class" : "5",
"Xun":{"heigh":175,"weigth":55,"sex":"男" }
}
②字符串:最常用,只是需要注意的是对特殊字符的转义/
③数组:最麻烦,JSON的数组可以是任何类型的组合,虽然在多数语言中这是不被允许的。比床头柜的抽屉,可能每层放不同的书籍,也可能某层放玩具、钞票、或者空着
{
"Drawer" : ["Toys","Book",null,1000 ]
}
④数字:整型、浮点型 如年龄、订货量 就是整数,欠款、股票收益 则可用 负浮点数表示。
{
"Age":15,
"balance":-123.456
}
⑤布尔:表示事物的两面性,正反(阴阳). 如:你是男是女?(是/不是) 你能活到80岁吗?(能/不能) 你有女朋友(单身狗)吗(有/没有)
{
"SingleDog" : true
}
⑥null : 对某事物的状态说明,表程度. 如:你有几套房子?(2/null -租房狗,鬼的房子) null表示没有值,JSON中必须用小写,包括 true、false。这里有一概念。字面量:字面值与表达值一至,需要用小写,否则解析时出错。
{
" House" :null
}
3.Json 限定
和大多数语言一样,对于某些成员变量,总会有一些跳跳框框的限定,或者说是一种规范,好比表单提交,年龄框数值超过认知范围,肯定是通过不了验证。对于Net 而言,在创建是数据库表对应的实体Model时,上面总会加上一行限定。而对于Json而言亦如此。
① 声明Json Schema 文件
②对属性进行限定 如 minLenth、maxLength、minimum、type、required 等
如:
{
"$schema" :"http://json-schema.org/draft-04/schema#",
"title" : "cat" ,
"properties" : { "name" :{ "type" : "string" , "minLenth" : 3 , "maxLenth" : 20 },
"age" : { "type" : "number" ," minimum" : 0 },
}
"required" : [ "name","age" ]
}
4. Json 序列化
当我们调用某个网站的接口,返回JSON数据的时候,对于Json 数据的序列化,我曾在从零开始调用手机号归属地查询的接口 随笔中,做过简单的说明,两种方法,各有千秋。
其一:
①创建参数对应实体;②调用JsonConvert类中 DeserializeObject<T> 方法进行解析;③根据节点关系访问数据
其二:
①直接调用JObject类中Parse方法进行解析;②根据节点关系访问数据
关于JSON 基本类型如上,实际项目中,我们不仅仅需要对JSON字符串进行解析,更多的有时候需要构造JSON对象,在C# 中需要用到JObject,JArray 两个对象,对于简单Json,构造如下
//简单JSON var json = new JObject { { "Code","1000"}, { "UserType",1} }; //简单数组Json var str = "geee;eefel;efgeg;"; var arydoorId = str.Split(';'); var jsonAuth = new JObject { {"doorGroupIds", new JArray(arydoorId)}, {"authorizeType", "1"}, {"personIds", new JArray("123","45")}, };
对于稍微复杂的组合json 对象,依旧使用上面两个对象,组合着使用即可,比如 若构造JSON 对象如下
构造方式如下:可以看到 JObject,JArray 两个对象可以相互包含,根据JSON对象的最终形态,灵活的进行组合使用
var jay = new JArray(); //简单JSON var json1 = new JObject { { "Code","1000"}, { "UserType",new JArray("1",2,"2r3",false)} }; var json2 = new JObject { { "Code","1001"}, { "UserType",2} }; jay.Add(json1); jay.Add(json2); var obj = new JObject { {"Code" ,1000}, { "Desc","Success"}, { "Data",jay} //等价于 obj.Add(jay); };
这里尤其需要注意数组,有时候调用第三方接口时,若包含数组,直接在JObject 中赋值 "[x1,x2]" 是无效的,必须要结合JArry来组合使用,完全与第三方接口内容保持一致才可
参考文献 《JSON必知必会》、《JSON入门指南》
---市人皆大笑,举手揶揄之
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?