Java数据解析之JSON
文章大纲
一、json介绍
二、常见框架介绍与实战
三、studio中gsonformat插件使用
四、项目源码下载(含参考资料)
五、参考文档
一、json介绍
1. 简介
json 的全称是 javascript object notation,是一种轻量级的数据交换格 式。
2. 特点
(1)json 比 xml 数据传输的有效性要高出很多
(2)json 完全独立于编程语言
(3)本质就是具有特定格式的字符串
3. json 数据格式
整体结构
string json1 = "{"id":12,"name":"tom"}" string json2 = "[{"id":12,"name":"tom"},{"id":12,"name":"tom"}]"
json 数组
(1)json 数组的结构: [value1, value2, value3]
(2)例子:
[1, “ab”,[], {“n”:123, “b”:”abc”}] 正确 [1, “a”:3] 错误
json 对象
(1)json 对象的结构: {key1:value1, key2:value2, key3:value3}
(2)key 的数据类型: 字符串
(3)value 的数据类型: 数值、字符串、null、json 数组 []、json 对象 {} (4)例子:
{“name”:”tom”,“age”:12} 正确 {“aa”:“a”, 3} 错误
4. 原始的json解析实战
将json格式的字符窜{}转换为java对象
api:jsonobject
jsonobject(string json) : 将 json 字符串解析为 json 对象
xxx getxxx(string name) : 根据 name, 在 json 对象中得到对应的 value
private void jsontojavaobjectbynative() { //获取或者创建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"; //解析json jsonobject jsonobject; //使用bean shopinfo shopinfo = null; try { jsonobject = new jsonobject(json); int id = jsonobject.getint("id"); int id1 = jsonobject.optint("id");//最好用opt方法,不会报异常 string name = jsonobject.optstring("name");//最好用opt方法,不会报异常 double imagepath = jsonobject.optdouble("price");//最好用opt方法,不会报异常 string price = jsonobject.optstring("imagepath");//最好用opt方法,不会报异常 shopinfo= new shopinfo(id,name,imagepath,price);//把数据放进来 } catch (jsonexception e) { // todo auto-generated catch block e.printstacktrace(); } }
将json格式的字符窜{}转换为java对象的list
api:jsonarray
jsonarray(string json) : 将 json 字符串解析为 json 数组
int length() : 得到 json 数组中元素的个数
xxx getxxx(int index) : 根据下标得到 json 数组中对应的元素数据
private void jsontojavalistbynative() { // todo auto-generated method stub //获取或者创建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" + "]"; //存放shopinfo集合 list<shopinfo> shops =new arraylist<shopinfo>(); //解析json try { jsonarray jsonarray = new jsonarray(json); //遍历数组 for (int i = 0; i < jsonarray.length(); i++) { jsonobject jsonobject = jsonarray.getjsonobject(i); //判断数据是否为空 if(jsonobject != null){ int id=jsonobject.optint("id"); string name = jsonobject.optstring("name");//最好用opt方法,不会报异常 double imagepath = jsonobject.optdouble("price");//最好用opt方法,不会报异常 string price = jsonobject.optstring("imagepath");//最好用opt方法,不会报异常 //封装java对象 shopinfo shopinfo= new shopinfo(id,name,imagepath,price);//把数据放进来 shops.add(shopinfo); } } } catch (jsonexception e) { // todo auto-generated catch block e.printstacktrace(); } }
复杂json数据解析
/** * 复杂json数据解析 * * 就是第一层是大数据包括第二第三层的,第二层要从第一层里拿到一个key然后获取下面的数据,然后第三层又是从第二层里拿到一个key然后获取里面的数据 * * 一层一层的解析,从大到小 */ private void jsontojavaofcomplex() { //获取或者创建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对象 dateinfo dateindo = new dateinfo(); jsonobject jsonobject; //解析json try { jsonobject = new jsonobject(json); //第一层解析一层一层解析 jsonobject date = jsonobject.optjsonobject("data");//date是一个集合 string rs_code = jsonobject.optstring("rs_code"); string rs_msg = jsonobject.optstring("rs_msg"); //第一层封装 一层一层封装 dateindo.setrs_code(rs_msg); dateindo.setrs_msg(rs_msg); dateinfo.databean datebean =new dateinfo.databean();//集合 dateindo.setdata(datebean); //第二层解析 int count =date.optint("count"); jsonarray items = date.optjsonarray("items"); //第二层数据封装 datebean.setcount(count);//从集合里面拿数据 list<dateinfo.databean.itemsbean> itemsbean = new arraylist<dateinfo.databean.itemsbean>(); datebean.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"); //第三层数据的封装 dateinfo.databean.itemsbean bean = new dateinfo.databean.itemsbean(); bean.setid(id); bean.settitle(title); itemsbean.add(bean); } } } catch (jsonexception e) { // todo auto-generated catch block e.printstacktrace(); } //显示json数据 tv_native_orignal.settext(json); tv_native_last.settext(dateindo.tostring()); }
二、常见框架介绍与实战
1. gson
简介
gson是google提供的用来在java对象和json数据之间进行映射的java类库。可以将一个json字符转成一个java对象,或者将一个java转化为json字符串。
特点
(1)快速、高效
(2)代码量少、简洁
(3)面向对象
(4)数据传递和解析方便
代码实战
将 json 格式的字符串{}转换为 java 对象
(1)用到的 api
<t> t fromjson(string json, class<t> classoft);//将 json 对象转换为 java 对象的方法
注意:要求 json 对象中的 key 的名称与 java 对象对应的类中的属性名要相同
(2)使用步骤
将 gson 的 jar 包导入到项目中
创建gson对象 : gson gson = new gson(); (3)通过创建的gson对象调用fromjson()方法,返回该json数据对应的java对象
/** * //将json格式的字符窜{}转换为java对象 */ 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(); //第一个参数是要解析的数据,第二个参数是解析生成的java对象的类 shopinfo shopinfo = gson.fromjson(json, shopinfo.class); }
将json格式的字符窜{}转换为java对象的list
(1)用到的 api
t fromjson(string json, type typeoft);//将 json 数组转换为 java 对象的 list 注意:要求 json 对象中的 key 的名称与 java 对象对应的类中的属性名要相同
(2)使用步骤
将 gson 的 jar 包导入到项目中
创建gson对象 : gson gson = new gson(); (3)通过创建的gson对象调用fromjson()方法,返回该json数据对应的java集合: list<shopinfo> shops = gson.fromjson(json, new
typetoken<list<shopinfo>>() {}.gettype());
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>:是要返回数据的集合 list<shopinfo> shops = gson.fromjson(json,new typetoken<list<shopinfo>>(){}.gettype()); //3显示数据 tv_gson_orignal.settext(json); tv_gson_last.settext(shops.tostring()); }
将java对象转换为json字符窜
(1)用到的 api
string tojson(object src);
(2)使用步骤
将 gson 的 jar 包导入到项目中
创建gson对象 : gson gson = new gson(); (3)通过创建的gson对象调用tojson()方法,返回json数据:
shopinfo shop = new shopinfo(1, "鲍鱼", 250.0, ""); string json = gson.tojson(shop);
private void javatojsonbygson() { //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); }
将 java 对象的 list 转换为 json 字符串[]
(1)用到的 api
string tojson(object src);
(2)使用步骤
将 gson 的 jar 包导入到项目中
创建gson对象 : gson gson = new gson(); (3)通过创建的gson对象调用tojson()方法,返回json数据:
list<shopinfo> shops = new arraylist<>(); string json = gson.tojson(shops);
/** * //将java对象的list转换为json字符窜 */ private void javatojsonarraybygson() { //1获取或创建java数据 list<shopinfo> shops =new arraylist<shopinfo>(); shopinfo baoyu = new shopinfo(1,"鲍鱼",250.0,"baoyu"); shopinfo longxia = new shopinfo(1,"龙虾",250.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); }
2. fastjson
简介
在日常的java项目开发中,json的使用越来越频繁,对于json的处理工具也有很多。接下来就介绍一下阿里开源的一个高性能的json框架fastjson,功能完善,完全支持标准json库,现在已经越来越受到开发者的青睐。
2. 特点
fastjson 是一个 java 语言编写的高性能功能完善的 json 库。它采用一种“假定有序快速匹配”的算法,把jsonparse的性能提升到极致,是目前java语言中最快的json库。
代码实战
将 json 格式的字符串{}转换为 java 对象
(1)用到的 api
< t > t parseobject(string json, class<t> classoft); //将 json 对象转换为 java对象的方法
注意:要求 json 对象中的 key 的名称与 java 对象对应的类中的属性名要相同
(2)使用步骤
导入 fastjson 的 jar 包 (2)json调用parseobject()方法,获取转换后的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
(1)用到的 api
list<t> parsearray(string json,class<t> classoft);//将 json 数组转换为 java 对象的 list
注意:要求 json 对象中的 key 的名称与 java 对象对应的类中的属性名要相同
(2)使用步骤
导入 fastjson 的 jar 包 (2)json调用parsearray()方法,获取转换后的java集合
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 字符串
(1)用到的 api
string tojsonstring(object object);
(2)使用步骤
导入 fastjson 的 jar 包
json调用tojsonstring()方法,获取转换后的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); }
将 java 对象的 list 转换为 json 字符串[]
(1)用到的 api
string tojsonstring(object object);
(2)使用步骤
导入 fastjson 的 jar 包
json调用tojsonstring()方法,获取转换后的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 数据显示 tv_fastjson_orignal.settext(shops.tostring()); tv_fastjson_last.settext(json); }
三、studio中gsonformat插件使用
1. gsonformat是什么
可根据xml内容快速生成bean类的插件
2. 使用方法
打开 android studio 页面,点击设置按钮
点击 plugins 按钮
在右侧输入框中输入 gsonformat,然后点击中间部位的 browse(必须在联网情况下点击)
选择 gsonformat,点击右侧的安装插件
重启一下 android studio
在 android studio 中创建一个类
在该类中同时按下 alt+shift+s,并点击 gsonformat
四、项目源码下载(含参考资料)
链接:https://pan.baidu.com/s/1pez1jmc6b2cvb8hqn6a-pg
密码:rpjy
五、参考文档
下一篇: C# 一些代码小结--UI操作