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入门指南》

  ---市人皆大笑,举手揶揄之

 

posted @ 2017-10-13 15:48  郎中令  阅读(472)  评论(0编辑  收藏  举报