文档章节

Java数据解析之JSON(非原创)

o
 osc_gu9d45li
发布于 2019/04/04 20:59
字数 2637
阅读 21
收藏 0

精选30+云产品,助力企业轻松上云!>>>

文章大纲

一、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

五、参考文档

    1. http://www.atguigu.com
    2. https://www.cnblogs.com/1024zy/p/6370305.html
o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
解析Json——Json类的静态方法

要使用bantouyan-json库解析Json数据,可以使用类Json。类Json是JsonArray、JsonObject和JsonPrimitive的基类,它有四个静态方法用于解析Json数据,这四个方法分别是parseJsonText、parseJs...

攻城狮不是猫
2015/07/01
47
0
Java基础-处理json字符串解析案例

                Java基础-处理json字符串解析案例                                   作者:尹正杰 版权声明:原创作品,谢绝转载!否...

osc_o5wlp6ft
2018/07/18
2
0
xml转json和实体类的两种方式

本文为博主原创,未经允许不得转载:   xml在http通信中具有较高的安全性和传输速度,所以应用比较广泛,   在项目中往往需要对xml,json和实体类进行相互转换,在这里总结一下自己所用到...

osc_gj6vn4dn
2019/04/07
7
0
Java中的自定义异常

在测试脚本的编写中会需要使用自定义异常,通常可以很容易地用Java创建自定义异常类。它可以是已检查或未检查的异常。下面将演示一个简单的示例来检查Java中自定义异常的创建。 如何创建自定...

八音弦
06/06
2
0
JSON的学习与使用

公众号:小李不秃,Java 原创博主 阅读本文大概需要 7.8 分钟 前言什么是 JSON为什么有 JSON如何使用 JSONJSON 的数据结构Json 在 javaScript 中的使用操作 Json 对象操作 JSON 数组JSON.pa...

osc_bdhojhcu
04/16
1
0

没有更多内容

加载失败,请刷新页面

加载更多

实战梯子游戏多年技巧心得回米必看

梯子游戏技巧交流回雪威【X3364FF】梯子游戏最起码是要学会找出它的规律,简单点我们要从低倍入手,这个有充足的考虑时间。 梯子游戏大概的走势可以分为长龙路、单跳路、对子路、房厅路。长龙...

风清杨啊
40分钟前
19
0
09VulKan——图像视图 采样器 组合图像取样器

整体思想: 使用一个纹理贴图到应用程序的流程: 注意: 在交换链和帧缓冲区中,图像不是直接访问,而是通过图像视图。这里借助图像视图来访问纹理图像 顶点着色器 #version 450#extensi...

黑白双键
41分钟前
11
0
等待收录

静态网站 https://dinghaobaojie.com/

张宏亮
54分钟前
18
0
UEditor富文本编辑

听很多人说百度推出的UEditor框架很实用,但是自己从来没有实践过,这一次有项目中用到,所以记录一下。(感觉一个东西会的人不难,没有做过掌握不到诀窍,就不太好弄) 主要可以分为三步: ...

axj_cfc
今天
28
0
分布式事务

分布式事务处理机制共有四种: 两阶段提交 TCC事务(事务补偿) 本地消息表(异步确保), MQ事务消息。 两阶段提交: 与数据库XA事务一样,两阶段提交使用XA协议。 两阶段提交这种方案属于牺...

九分石人
今天
21
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部