JSON用法小结

Android入行多年,用起JSON依然是捉襟见肘,无法手到擒来的感觉实在是让自己汗颜。于是决定把JSON从头到尾总结一遍。这里很多是根据网络上现有的资料进行的总结。

什么是JSON

JavaScrip Object Notation,JS对象标记,简写成JSON。

网络上无法直接传递结构复杂的数据,需要把这些复杂的结构转换为简单结构。JSON就是一套简单的格式规范,把复杂的数据结构转换成最简单的字符串。

在JSON之前,网络上大家使用XML的格式来传递数据。但是XML格式比较复杂,后来就出现了轻量化的JSON替代了XML。

JSON的字符集必须是utf-8。所以不存在跨平台的问题。

JSON只有6种数据类型:

  • number: 数值,包括整型、浮点型
  • string: 字符串
  • boolean: 布尔值,true和false
  • null: 等同于Java的null
  • array: 数组
  • object: JSON对象,它是以上五种类型的组合

JSON的构成规则:

  • 数据在键值对中
  • 数据用逗号隔开
  • 花括号表示对象
  • 方括号表示数组
  • 双引号表示字符
  • 键值对里的key用双引号包含
  • 6种基本类型可以任意组合

JSON实例

{
    "name" : "xiaoming",
    "age" : 18,
    "marriage" : false,

    "nickname" : [  // 字符串数组
        "ming",
        "dong",
        "zhuzi"
    ],

    "bookList": [  // 对象数组
        {"title" : "Pride and Prejudice",   "price" : 20},
        {"title" : "History of the America",   "price" : 40}
    ]        
}

数组里的值,可以是基本类型中的任意一种。bookList里是JSON object的列表(数组)。

Map在JSON里长什么样呢?不是array,是一个普通的object

{
    "mapExample": {
        "key1": "value1",
        "key2": "value2",
        "key3": "value3",
   }
}

经典的状态机表示法

JSON object

JSON array

JSON string

JSON number

如何使用JSON

JSON的形态

JSON本质上是一串utf-8编码的符合Json格式的字符。『JSON』这个词,广义上是指这串字符及其用法;狭义上就是指这串字符。JSON的形态,描述的是狭义上,也就是JSON字符串的形态。对于我们这些需要去处理它的人来说,它存在两种状态:

  1. 静态的字符串
  2. 格式化后对应的数据结构

我们经常需要在这两种状态之间进行转换。比如,将某个数据结构转成JSON字符串;或者从某个JSON字符串中读取某个字段。从1到2的过程,称之为『进』;从2到1,称之为『出』。JSON的用法,就是围绕着这两个状态展开说明。

下面只介绍Java类库的JSON包和Google的Gson。

Java上的JSON包

org.json包,有以下几个主要类:

  • JSONObject:它能够从JSON字符串中解析出里面的元数据;或者把元数据组装成JSON字符串。
  • JSONArray:它是JSONObject的一个子集,只处理JSON array相关的数据。
  • JSONTokener:
  • JSONPointer
  • JSONString
  • JSONStringer
  • JSONWriter

最常用的是JSONObject和JSONArray,它们能满足日常需求。这两者本身就是格式化后的数据结构的代表,存储的是格式化后的数据。下面只介绍这两个的用法,其它的以后有时间再展开。

JSONObject的进

JSONObject就是JSON基本里的Object,它只支持以花括号({})开头和结尾的字符串。它包含其它类型以及自己。它的『进』有两种方式:

  1. JSONObject的构造函数
  2. JSONObject的put方法

构造函数里传入符合JSON格式的字符串,得到格式化后的数据,例如:

new JSONObject(jsonStr);

put方法用来增加数据。它增加基本类型很直观,直接放进去就好了。Object类型需要注意。放进去的值是Object.toString后的值。所以如果是一个普通的Java的Object,那么值就是这个对象的类名(除非重写toString方法)。如果传入的是JSONObject或者JSONArray类型的Object,这两者的toString得到的值就是JSON字符串。

JSONObject的put方法

通过构造函数生成JSONObject后,还可以继续用put方法增加数据(新字段)和修改数据(原有字段)。

JSONObject是格式化后的结构,因此可以方便地取出其中的数据。

  • get方法
  • opt方法

两者的区别是,get方法会抛出异常,opt方法不会,并且可以使用默认值。

JSONObject的get方法
JSONObject的opt方法

JSONObject的出

转换成静态的Json字符串,直接使用toString方法即可。

JSONArray的进和出

它支持各种基础类型。和JSONObject类似,每个接口多index参数,表示数组的位置。


JSONArray的put接口
JSONArray的get接口
JSONArray的opt接口

Android上的Gson包

Gson是Google的Json处理工具。它提供了比Java的Json工具包更强大和方便的功能。它的基本使用,都集中在Gson.java这个类。为了不把两者混淆,后面用gson来表示Gson这个类。

Gson的适用性比JSONObject大,后者只支持标准格式的Json字符串。Gson可以支持单独的Json数据类型,比如:

int intValue = gson.fromJson("128", Integer.class);  // intValue=128
Integer[] intArray = gson.fromJson("[1, 2, 4, 8, 16]", Integer[].class);  // intArray=[1, 2, 4, 8, 16]

Gson的常规用法非常简单,所有的接口都集中在gson里。gson为一个入口,非常简洁,基本上只提供了两类方法,也就是『进』fromJson()和『出』toJson()。

gson的『进』

fromJson接口,从各种类型的源中直接生成所需要的数据结构。对比JSONObject,gson更方便。前者只是做了格式化,后者不但格式化,而且生成对应的数据结构对象(某个具体的数据对象)。

fromJson接口

gson的『出』

toJson接口,从各种类型的格式化数据源,生成对应的JSON字符串。同样,对比JSONObject,gson可以直接将数据结构对象转成JSON字符串。前者只能手动从数据对象中一个字段一个字段地转成JSONObject,然后再转成JSON字符串。


toJson接口

Gson的数据类型

Gson把JSON的六种基本数据类型进行了封装。基类是JsonElement。string、number和boolean这三种基本类型统一为JsonPrimitive。还有JsonObject、JsonArray和JsonNull。
这部分的详细说明,后续再细化,本文会持续更新。


JsonElement结构图

Gson的高级用法

Gson还有很多高级的用法,比如可添加adapter,用的比较少,以后另外看一篇介绍。

参考

廖雪峰 JavaScrip教程

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容