json的解析
Posted 劲火星空
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了json的解析相关的知识,希望对你有一定的参考价值。
一、概念
什么是json
简单地说,JSON 可以将 javascript 对象中表示的一组数据转换为字符串,然后就可以在函数之间轻松地传递这个字符串,或者在异步应用程序中将字符串从 Web 客户机传递给服务器端程序。这个字符串看起来有点儿古怪,但是 JavaScript 很容易解释它,而且 JSON 可以表示比"名称 / 值对"更复杂的结构。例如,可以表示数组和复杂的对象,而不仅仅是键和值的简单列表。
二、特点
(1)表示名称键值对
这个比较简单,表示的形式如下:
按照最简单的形式,可以用下面这样的 JSON 表示 "名称 / 值对" : "firstName": "Brett"
(2)表示数组
如果使用 JSON,就只需将多个带花括号的记录分组在一起:
"people": [
"firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" ,
"firstName": "Jason", "lastName":"Hunter", "email": "bbbb",
"firstName": "Elliotte", "lastName":"Harold", "email": "cccc"
]
三、原生解析
1.原生解析
(1)将json格式的字符串解析为对象
private void jsonToJavaObjectByNative()
// 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";
ShopInfo shopInfo = null;
// 2 解析json
try
JSONObject jsonObject = new JSONObject(json);
// int id = jsonObject.getInt("id");
int id1 = jsonObject.optInt("id");
String name = jsonObject.optString("name");
double price = jsonObject.optDouble("price");
String imagePath = jsonObject.optString("imagePath");
// 封装Java对象
shopInfo = new ShopInfo(id1, name, price, imagePath);
catch (JSONException e)
e.printStackTrace();
// 3 显示JSON数据
tv_native_orignal.setText(json);
tv_native_last.setText(shopInfo.toString());
(2)将json字符串转换成对象的List
private void jsonToJavaObjectByNative()
// 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";
ShopInfo shopInfo = null;
// 2 解析json
try
JSONObject jsonObject = new JSONObject(json);
// int id = jsonObject.getInt("id");
int id1 = jsonObject.optInt("id");
String name = jsonObject.optString("name");
double price = jsonObject.optDouble("price");
String imagePath = jsonObject.optString("imagePath");
// 封装Java对象
shopInfo = new ShopInfo(id1, name, price, imagePath);
catch (JSONException e)
e.printStackTrace();
// 3 显示JSON数据
tv_native_orignal.setText(json);
tv_native_last.setText(shopInfo.toString());
(3)嵌套的json的解析
对于这样形式的json对象字符串,需要进行一层一层的解析
private void jsonToJavaOfComplex()
// 1 获取或创建JSON数据
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" +
"";
// 封装Java对象
DataInfo dataInfo = new DataInfo();
// 2 解析json
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();
// 3 显示JSON数据
tv_native_orignal.setText(json);
tv_native_last.setText(dataInfo.toString());
四、Gson解析
可以看出来通过原生的方式来进行解析还是比较困难的
(1)将json格式的字符串解析为对象
private void jsonToJavaObjectByGson()
// 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数据
Gson gson = new Gson();
ShopInfo shopInfo = gson.fromJson(json, ShopInfo.class);
// 3 展示数据
tv_gson_orignal.setText(json);
tv_gson_last.setText(shopInfo.toString());
如下是ShopInfo对象
public class ShopInfo
private int id;
private String name;
private double price;
private String imagePath;
public ShopInfo(int id, String name, double price, String imagePath)
this.id = id;
this.name = name;
this.price = price;
this.imagePath = imagePath;
public ShopInfo()
public int getId()
return id;
public void setId(int id)
this.id = id;
public String getName()
return name;
public void setName(String name)
this.name = name;
public double getPrice()
return price;
public void setPrice(double price)
this.price = price;
public String getImagePath()
return imagePath;
public void setImagePath(String imagePath)
this.imagePath = imagePath;
@Override
public String toString()
return "ShopInfo" +
"id=" + id +
", name='" + name + '\\'' +
", price=" + price +
", imagePath='" + imagePath + '\\'' +
'';
(2)将json字符串解析成对象的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());
// 3 展示数据
tv_gson_orignal.setText(json);
tv_gson_last.setText(shops.toString());
(3)将java对象转换成json字符串
private void javaToJsonObjectByGson()
// 1 获取或创建Java对象
ShopInfo shopInfo = new ShopInfo(1,"鲍鱼",250.0,"baoyu");
// 2 生成JSON数据
Gson gson = new Gson();
String json = gson.toJson(shopInfo);
// 3 展示数据
tv_gson_orignal.setText(shopInfo.toString());
tv_gson_last.setText(json);
(4)将java对象List转换成json字符串
好的的方法都已经封装好了,使用起来还是挺给力的
private void javaToJsonArrayByGson()
// 1 获取或创建Java对象
List<ShopInfo> shops = new ArrayList<>();
ShopInfo baoyu = new ShopInfo(1, "鲍鱼", 250.0, "baoyu");
ShopInfo longxia = new ShopInfo(2, "龙虾", 251.0, "longxia");
shops.add(baoyu);
shops.add(longxia);
// 2 生成JSON数据
Gson gson = new Gson();
String json = gson.toJson(shops);
// 3 展示数据
tv_gson_orignal.setText(shops.toString());
tv_gson_last.setText(json);
五、FastJson解析
(1)将json格式的字符串解析为对象
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);
// 3 显示数据
tv_fastjson_orignal.setText(json);
tv_fastjson_last.setText(shopInfo.toString());
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);
// 3 显示数据
tv_fastjson_orignal.setText(json);
tv_fastjson_last.setText(shopInfos.toString());
(3)将java对象转换成json字符串
private void javaToJsonObjectByFastJson()
// 1 创建一个Java对象
ShopInfo shopInfo = new ShopInfo(1, "鲍鱼", 250.0, "baoyu");
// 2 生成JSON数据
String json = JSON.toJSONString(shopInfo);
// 3 显示数据
tv_fastjson_orignal.setText(shopInfo.toString());
tv_fastjson_last.setText(json);
(4)将java对象List转换成json字符串
private void javaToJsonArrayByFastJson()
// 1 创建一个Java集合
List<ShopInfo> shops = new ArrayList<>();
ShopInfo baoyu = new ShopInfo(1, "鲍鱼", 250.0, "baoyu");
ShopInfo longxia = new ShopInfo(2, "龙虾", 251.0, "longxia");
shops.add(baoyu);
shops.add(longxia);
// 2 生成JSON数据
String json = JSON.toJSONString(shops);
// 3 显示JSON数据
tv_fastjson_orignal.setText(shops.toString());
tv_fastjson_last.setText(json);
以上是关于json的解析的主要内容,如果未能解决你的问题,请参考以下文章