这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战
上篇文章中我们已经讲解了XML文件的解析与序列化,本篇文章我们接着上篇文章接着说另外一种数据传输格式——Json。
一、概述
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式, 易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。二、语法规则
(1)、JSON 语法是 JavaScript 对象表示语法的子集。- 数据在键值对中
- 数据由逗号分隔
- 花括号保存对象
- 方括号保存数组
例如:
JSON 数据的书写格式是:名称/值对
名称/值对组合中的名称写在前面(在双引号中),值对写在后面(同样在双引号中),中间用冒号隔开:
"firstName":"John"
(2)、JSON 值可以是:
- 数字(整数或浮点数)
- 字符串(在双引号中)
- 逻辑值(true 或 false)
- 数组(在方括号中)
- 对象(在花括号中)
- null
三、JSON的两种结构
JSON有两种表示结构,对象和数组。(1)、对象结构以”{”大括号开始,以”}”大括号结束。中间部分由0或多个以”,”分隔的”key(关键字)/value(值)”对构成,关键字和值之间以”:”分隔,语法结构如代码。
{
key1:value1,
key2:value2,
...
}
(2)、数组结构以”[”开始,”]”结束。中间由0或多个以”,”分隔的值列表组成,语法结构如代码。
[ { key1:value1, key2:value2 }, { key3:value3, key4:value4 } ]
下面我们开始学习Json数据的解析。首先我们下载gson.jar包,然后导入Android Studio中,注意,要在module的gradle文件中添加:
compile files('libs/gson-2.3.0.jar')
我们需要明白三个类:Gson、JsonObject、JsonArray。
(1)、Gson类:
Gson是一个工具类,需要使用gson.jar包,使用很简单,用于将Json字符串的转换。主要的两个方法:
- toJson()
- fromJson()
例如:
public static String ObjectToJson(Object object){
Gson gson = new Gson();
return gson.toJson(object);
}
通过这两个方法,可以将我们的对象实体转换成键值对的json字符串。
(2)、JsonObject类:
json对象,就是一个键对应一个值,使用的是大括号{ },如:{key:value}
{"author":"何红辉、关爱民","name":"Android源码设计模式解析与实战","price":"79.0"}
常用方法:
(1)、构造方法:
- public JSONObject(String json) throws JSONException:将json字符串转换成JSONObject对象
- public JSONObject(Map copyFrom):由一个Map集合内容构成一个JSONObject对象。
(2)普通方法:
- public int length():返回JSONObject中有多少对键值对
- JSONObject put(String name, **) throws JSONException:向JSONObject中填充键值对。
- get():用于获取里面的键值对值
- JSONArray getJSONArray(String name):获取JSONObject中key对应的JSONArray对象。
例如:
JSONObject jsonObject = new JSONObject();
jsonObject.put("author","何红辉、关爱民");
jsonObject.put("name","Android源码设计模式解析与实战");
jsonObject.put("price","79.0");
(3)、JsonArray类:
JsonObject数组,使用中括号[ ]包含。
[{"author":"何红辉、关爱民","price":"79.0","name":"Android源码设计模式解析与实战"}]
常用方法:
(1)、构造方法:
- JSONArray():无参构造方法,生成一个对象
- public JSONArray(Collection copyFrom):从Collection集合生成对象
- public JSONArray(String json) throws JSONException:从json字符串生成对象
- put(Object):向JSONArray中添加值
- put(int ,object):在jsonarray指定下标位置添加值。
- get(int):根绝指定下标获取值
例如:
JSONArray jsonArray = new JSONArray();
jsonArray.put(jsonObject);
Log.d(TAG,jsonArray.toString());
实例,大家可以自己写几个试试,我们现在写个小demo,随便看看
JSONObject jsonObject = new JSONObject();
jsonObject.put("author","何红辉、关爱民");
jsonObject.put("name","Android源码设计模式解析与实战");
jsonObject.put("price","79.0");
JSONArray jsonArray = new JSONArray();
jsonArray.put(jsonObject);
jsonArray.put(1314);
jsonArray.put(true);
Log.d(TAG,jsonArray.toString());
输入结果:
[{"author":"何红辉、关爱民","price":"79.0","name":"Android源码设计模式解析与实战"},1314,true]
我们在看下面:
JSONObject jsonObject = new JSONObject();
jsonObject.put("name","Android源码设计模式解析与实战");
jsonObject.put("price","79.0");
JSONArray jsonArray = new JSONArray();
jsonArray.put(jsonObject);
jsonArray.put(1314);
jsonArray.put(true);
jsonArray.put(1,"在1的位置添加");
Log.d(TAG,jsonArray.toString());
看看输出结果:
[{"author":"何红辉、关爱民","price":"79.0","name":"Android源码设计模式解析与实战"},"在1的位置添加",true]
对比发现,会覆盖掉原来的值,这点大家注意点就可以了。至此,结合上篇的xml解析,基本的数据解析已经解析完毕,欢迎大家留言。