首语
- 本文主要使用三种json解析技术,包括Android原生解析,Gson框架解析,FastJson框架解析。主要以代码举例进行学习。供大家借阅参考,一起进步。
简介
- JSON的全称是JavaScript Object Notation,是一种轻量级的数据交换格式。
特点
-
JSON比XML数据传输的有效性要高出很多。
-
JSON完全独立于编程语言。
-
本质就是有特定格式的字符串。
数据格式
-
Json对象{key1:value1,key2:value2,key3:value3}
-
Json数组[value1,value2,value3]
-
例:[1,"ab",[],{"n":123,"b":"abc"}]
解析方向
- json<——>javaBean
工具
- HiJson:Json格式化工具,以树的形式展示,方便json字符查看。
- GsonFormat插件:快速创建符合的JavaBean。
- 打开AndroidStudio—>File—>Settings—>Plugins—>搜索框搜索GsonFormat下载。使用时alt+insert快捷键,点击GsonFormat,将json字符串粘贴,就可得到JavaBean。
- 后面代码的JavaBean都使用GsonFormat自动生成,不再罗列。
安卓原生解析
-
只提供了将json数据转换为java数据,不提供java转json。
-
将JSON对象转换为Java对象
json:
{
"id":2,
"name":"大虾",
"price":12.3,
"imagePath":"http://192.168.10.165:8080/L05_Server/images/f1.jpg"
}
//将JSON对象转换为Java对象
private void jsonToObjectByNative () {
// 1 获取或创建JSON数据
String json = "{\n" +
"\t\"id\":2, \"name\":\"大虾\", \n" +
"\t\"price\":12.3, \n" +
"\t\"imagePath\":\"http://192.168.10.165:8080/L05_Server/images/f1.jpg\"\n" +
"}\n";
//2.解析json
try {
JSONObject jsonObject = new JSONObject(json);
int id = jsonObject.optInt("id");
String name = jsonObject.optString("name");
double price = jsonObject.optDouble("price");
String imagePath = jsonObject.optString("imagePath");
shopInfo = new ShopInfo(id, name, price, imagePath);
} catch (JSONException e) {
e.printStackTrace();
}
}
- 将JSON数组转换为Java集合
json
[
{
"id": 1,
"imagePath": "http://192.168.10.165:8080/L05_Server/images/f1.jpg",
"name": "大虾1",
"price": 12.5
},
{
"id": 2,
"imagePath": "http://192.168.10.165:8080/L05_Server/images/f2.jpg",
"name": "大虾2",
"price": 12.3
}
]
//将JSON数组转换为Java集合
private void jsonToJavaListByNative () {
List<ShopInfo> list = new ArrayList<>();
//1.获取或创建JSON数据
String json = "[\n" +
" {\n" +
" \"id\": 1,\n" +
" \"imagePath\": \"http://192.168.10.165:8080/f1.jpg\",\n" +
" \"name\": \"大虾1\",\n" +
" \"price\": 12.3\n" +
" },\n" +
" {\n" +
" \"id\": 2,\n" +
" \"imagePath\": \"http://192.168.10.165:8080/f2.jpg\",\n" +
" \"name\": \"大虾2\",\n" +
" \"price\": 12.5\n" +
" }\n" +
"]";
//2.解析json
try {
JSONArray jsonArray = new JSONArray(json);
for (int i = 0; i < 2; i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
if (jsonObject != null) {
int id = jsonObject.optInt("id");
String name = jsonObject.optString("name");
double price = jsonObject.optDouble("price");
String imagePath = jsonObject.optString("imagePath");
shopInfo = new ShopInfo(id, name, price, imagePath);
list.add(shopInfo);
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
- 复杂JSON数据解析
json
{
"data": {
"count": 5,
"items": [
{
"id": 45,
"title": "坚果"
},
{
"id": 132,
"title": "炒货"
},
{
"id": 166,
"title": "蜜饯"
},
{
"id": 195,
"title": "果脯"
},
{
"id": 196,
"title": "礼盒"
}
]
},
"rs_code": "1000",
"rs_msg": "success"
}
// 复杂JSON数据解析
private void jsonToJavaOfComplex () {
//1.获取或创建数据
String json = "{\n" +
" \"data\": {\n" +
" \"count\": 5,\n" +
" \"items\": [\n" +
" {\n" +
" \"id\": 45,\n" +
" \"title\": \"坚果\"\n" +
" },\n" +
" {\n" +
" \"id\": 132,\n" +
" \"title\": \"炒货\"\n" +
" },\n" +
" {\n" +
" \"id\": 166,\n" +
" \"title\": \"蜜饯\"\n" +
" },\n" +
" {\n" +
" \"id\": 195,\n" +
" \"title\": \"果脯\"\n" +
" },\n" +
" {\n" +
" \"id\": 196,\n" +
" \"title\": \"礼盒\"\n" +
" }\n" +
" ]\n" +
" },\n" +
" \"rs_code\": \"1000\",\n" +
" \"rs_msg\": \"success\"\n" +
"}";
//2.解析json
DataInfo dataInfo = new DataInfo();
try {
JSONObject jsonObject = new JSONObject(json);
//第一层解析
JSONObject data = jsonObject.optJSONObject("data");
String rs_code = jsonObject.optString("rs_code");
String rs_msg = jsonObject.optString("rs_msg");
//第一层封装
dataInfo.setRs_code(rs_code);
dataInfo.setRs_msg(rs_msg);
DataInfo.DataBean dataBean = new DataInfo.DataBean();
dataInfo.setData(dataBean);
//第二层解析
int count = data.optInt("count");
JSONArray items = data.optJSONArray("items");
//第二层封装
dataBean.setCount(count);
List<DataInfo.DataBean.ItemsBean> itemsBean = new ArrayList<>();
dataBean.setItems(itemsBean);
//第三层解析
for (int i = 0; i < items.length(); i++) {
JSONObject jsonObject1 = items.optJSONObject(i);
if (jsonObject1 != null) {
int id = jsonObject1.optInt("id");
String title = jsonObject1.optString("title");
//第三层数据封装
DataInfo.DataBean.ItemsBean bean = new DataInfo.DataBean.ItemsBean();
bean.setId(id);
bean.setTitle(title);
itemsBean.add(bean);
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
- 特殊JSON数据解析
json
{
"code": 0,
"list": {
"0": {
"aid": "6008965",
"author": "哔哩哔哩番剧",
"coins": 170,
"copyright": "Copy",
"create": "2016-08-25 21:34"
},
"1": {
"aid": "6008938",
"author": "哔哩哔哩番剧",
"coins": 404,
"copyright": "Copy",
"create": "2016-08-25 21:33"
}
}
}
//特殊JSON数据解析
private void jsonToJavaOfSpecial () {
//1.获取或创建数据
String json = "{\n" +
" \"code\": 0,\n" +
" \"list\": {\n" +
" \"0\": {\n" +
" \"aid\": \"6008965\",\n" +
" \"author\": \"哔哩哔哩番剧\",\n" +
" \"coins\": 170,\n" +
" \"copyright\": \"Copy\",\n" +
" \"create\": \"2016-08-25 21:34\"\n" +
" },\n" +
" \"1\": {\n" +
" \"aid\": \"6008938\",\n" +
" \"author\": \"哔哩哔哩番剧\",\n" +
" \"coins\": 404,\n" +
" \"copyright\": \"Copy\",\n" +
" \"create\": \"2016-08-25 21:33\"\n" +
" }\n" +
" }\n" +
"}";
//2.解析json
FilmInfo filmInfo = new FilmInfo();
try {
JSONObject jsonObject = new JSONObject(json);
//第一层解析
int code = jsonObject.optInt("code");
JSONObject list = jsonObject.optJSONObject("list");
//第一层封装
filmInfo.setCode(code);
List<FilmInfo.FilmBean> lists = new ArrayList<>();
filmInfo.setList(lists);
//第二层解析
for (int i = 0; i < list.length(); i++) {
JSONObject jsonObject1 = list.optJSONObject(i + "");
if (jsonObject1 != null) {
String aid = jsonObject1.optString("aid");
String author = jsonObject1.optString("author");
int coins = jsonObject1.optInt("coins");
String copyright = jsonObject1.optString("copyright");
String create = jsonObject1.optString("create");
//第二层数据封装
FilmInfo.FilmBean filmBean = new FilmInfo.FilmBean();
filmBean.setAid(aid);
filmBean.setAuthor(author);
filmBean.setCoins(coins);
filmBean.setCopyright(copyright);
filmBean.setCreate(create);
lists.add(filmBean);
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
Gson解析
- Gson是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库。可以将一个Json字符转成一个Java对象,或者将一个Java转化为Json字符串。
特性
- 快速、高效。
- 代码量少、简洁。
- 面向对象。
- 数据传递和解析方便。
GitHub地址:https://github.com/google/gson
依赖:implementation 'com.google.code.gson:gson:2.8.5'
- 将json格式的字符串{}转换为Java对象
// 将json格式的字符串{}转换为Java对象
private void jsonToJavaObjectByGson () {
//创建数据
String json = "{\n" +
"\t\"id\":2, \"name\":\"大虾\", \n" +
"\t\"price\":12.3, \n" +
"\t\"imagePath\":\"http://192.168.10.165:8080/L05_Server/images/f1.jpg\"\n" +
"}\n";
//解析json数据
Gson gson = new Gson();
ShopInfo shopInfo = gson.fromJson(json, ShopInfo.class);
}
- 将json格式的字符串数组转换为Java对象的List
//将json格式的字符串[]转换为Java对象的List
private void jsonToJavaListByGson () {
// 1 获取或创建JSON数据
String json = "[\n" +
" {\n" +
" \"id\": 1,\n" +
" \"imagePath\": \"http://192.168.10.165:8080/f1.jpg\",\n" +
" \"name\": \"大虾1\",\n" +
" \"price\": 12.3\n" +
" },\n" +
" {\n" +
" \"id\": 2,\n" +
" \"imagePath\": \"http://192.168.10.165:8080/f2.jpg\",\n" +
" \"name\": \"大虾2\",\n" +
" \"price\": 12.5\n" +
" }\n" +
"]";
//2.解析json
Gson gson = new Gson();
List<ShopInfo> shops = gson.fromJson(json, new TypeToken<List<ShopInfo>>() {
}.getType());
}
- 将Java对象转换为json字符串对象
//将Java对象转换为json字符串{}
private void javaToJsonObjectByGson () {
//1.创建java对象
ShopInfo shopInfo = new ShopInfo(1, "鲍鱼", 250, "baoyuwang.com.cn");
//2.生成json数据
Gson gson = new Gson();
String json = gson.toJson(shopInfo);
}
- 将java对象的List转换为json字符串数组
//将Java对象的List转换为json字符串[]
private void javaToJsonArrayByGson () {
//1.创建java对象
List<ShopInfo> shops = new ArrayList<>();
ShopInfo baoyu = new ShopInfo(1, "鲍鱼", 250, "baoyuwang.com.cn");
ShopInfo longxia = new ShopInfo(1, "龙虾", 200, "longxiawang.com.cn");
shops.add(baoyu);
shops.add(longxia);
//2.生成jsonshuj
Gson gson = new Gson();
String json = gson.toJson(shops);
}
FastJson解析
- java语言编写的高性能完善的json库,采用一种“假定有序快速匹配”的算法,把JSON Parse的性能提升到极致,目前java语言中最快的JSON库。
特性
- 快速FAST (比其它任何基于Java的解析器和生成器更快,包括jackson)
- 强大(支持普通JDK类包括任意Java Bean Class、Collection、Map、Date或enum)
- 零依赖(没有依赖其它任何类库除了JDK)
GitHub地址:https://github.com/alibaba/fastjson
依赖:implementation 'com.alibaba:fastjson:1.2.59'
- 将json格式的字符串对象转换为Java对象
//将json格式的字符串{}转换为Java对象
private void jsonToJavaObjectByFastJson () {
//1.创建json数据
String json = "{\n" +
"\t\"id\":2, \"name\":\"大虾\", \n" +
"\t\"price\":12.3, \n" +
"\t\"imagePath\":\"http://192.168.10.165:8080/L05_Server/images/f1.jpg\"\n" +
"}\n";
//2.json解析
ShopInfo shopInfo = JSON.parseObject(json, ShopInfo.class);
}
- 将json格式的字符串数组转换为Java对象的List
//将json格式的字符串[]转换为Java对象的List
private void jsonToJavaListByFastJson () {
//1.创建json数据
String json = "[\n" +
" {\n" +
" \"id\": 1,\n" +
" \"imagePath\": \"http://192.168.10.165:8080/f1.jpg\",\n" +
" \"name\": \"大虾1\",\n" +
" \"price\": 12.3\n" +
" },\n" +
" {\n" +
" \"id\": 2,\n" +
" \"imagePath\": \"http://192.168.10.165:8080/f2.jpg\",\n" +
" \"name\": \"大虾2\",\n" +
" \"price\": 12.5\n" +
" }\n" +
"]";
//2.json解析
List<ShopInfo> shopInfos = JSON.parseArray(json, ShopInfo.class);
}
- 将Java对象转换为json字符串对象
//将Java对象转换为json字符串{}
private void javaToJsonObjectByFastJson () {
//1.创建java对象
ShopInfo shopInfo = new ShopInfo(1, "小成", 10000, "xiaochengwang.com.cn");
//2.生成json数据
String json = JSON.toJSONString(shopInfo);
}
- 将Java对象的List转换为json字符串数组
//将Java对象的List转换为json字符串[]
private void javaToJsonArrayByFastJson () {
//1.创建java对象
List<ShopInfo> list = new ArrayList<>();
ShopInfo xiaoli = new ShopInfo(1, "xiaoli", 220, "xiaoliwang.com.cn");
ShopInfo xiaoying = new ShopInfo(2, "xiaoying", 120, "xiaoyingwang.com.cn");
list.add(xiaoli);
list.add(xiaoying);
//2.生成json数据
String json = JSON.toJSONString(list);
}