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

摘要:
文章概述1.JSON简介2.通用框架和实践简介3.在Studio中使用GsonFormat插件4.下载项目源代码(包括参考)5.参考文档1.JSON介绍1.简介JSON称为JavaScript ObjectNotation,这是一种轻量级数据交换格式。2.特点(1)JSON比XML数据传输更有效(2)JSON完全独立于编程语言(3)本质上,它是一个具有特定格式的字符串3.JSON数据格式的整体结构

文章大纲

一、JSON介绍
二、常见框架介绍与实战
三、Studio中GsonFormat插件使用
四、项目源码下载(含参考资料)
五、参考文档

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

一、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 = "{
" +                
                        "	"id":2, "name":"大虾", 
" +                 
                         "	"price":12.3, 
" +                 
                        "	"imagePath":"http://192.168.10.165:8080/L05_Server/images/f1.jpg"
" + 
                        "}
";
        //解析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= "[
" +
        "    {
" +
        "        "id": 1,
" +
        "        "imagePath": "http://192.168.10.165:8080/f1.jpg",
" +             "        "name": "大虾 1",
" +             "        "price": 12.3
" +
        "    },
" +
        "    {
" +
        "        "id": 2,
" +
        "        "imagePath": "http://192.168.10.165:8080/f2.jpg",
" +
        "        "name": "大虾 2",
" +
        "        "price": 12.5
" +
        "    }
" +
        "]";
        //存放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 ="{
" +
                " "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"
" +
                "}";
        //封装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 ="{
" +
        "	"id":2, "name":"大虾", 
" + 
        "	"price":12.3, 
" +
        "	"imagePath":"http://192.168.10.165:8080/L05_Server/images/f1.jpg"
" + 
        "}
";
        //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 = "[
" + 
        "    {
" + 
                 "        "id": 1,
" + 
        "        "imagePath": "http://192.168.10.165:8080/f1.jpg",
" + 
                 "        "name": "大虾 1",
" + 
        "        "price": 12.3
" +             "    },
" +             "    {
" +  
                 "        "id": 2,
" + 
        "        "imagePath": "http://192.168.10.165:8080/f2.jpg",
" +
        "        "name": "大虾 2",
" + 
        "        "price": 12.5
" +             "    }
" +
        "]";
        //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 = "{
" +
"	"id":2, "name":"大虾", 
" +
"	"price":12.3, 
" +
"	"imagePath":"http://192.168.10.165:8080/L05_Server/images/f1.jpg "
" +
"}
";
// 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 = "[
" +
" {
"+
" "id": 1,
" +
" "imagePath":
"http://192.168.10.165:8080/f1.jpg",
" +
" " " " " "
"name": "大虾 1",
" +
"price": 12.3
" + },
" +
{
"+
"id": 2,
" + "imagePath":
"http://192.168.10.165:8080/f2.jpg",
" +
" "name": "大虾 2",
" +
" "price": 12.5
" + " }
"+
"]";
// 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 页面,点击设置按钮

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

点击 Plugins 按钮

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

在右侧输入框中输入 gsonformat,然后点击中间部位的 Browse(必须在联网情况下点击)

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

选择 GsonFormat,点击右侧的安装插件

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

重启一下 Android studio

在 Android studio 中创建一个类

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

在该类中同时按下 alt+shift+s,并点击 GsonFormat

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

四、项目源码下载(含参考资料)

链接:https://pan.baidu.com/s/1PEz1jMc6B2CvB8HQn6A-pg
密码:rpjy

五、参考文档

    1. http://www.atguigu.com
    2. https://www.cnblogs.com/1024zy/p/6370305.html

免责声明:文章转载自《Java数据解析之JSON(非原创)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【转】Python 数据库连接池winform把图片存储到数据库下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Jsr303数据校验

空检查 @Null 验证对象是否为null @NotNull 验证对象是否不为null, 无法查检长度为0的字符串 @NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格. @NotEmpty 检查约束元素是否为NULL或者是EMPTY. Booelan检查 @AssertTrue 验证 Boolean...

C#原生加密方法: System.Security.Cryptography.CryptoStream DataSet加密解密

采用16位密钥形式加密,把数据 dataset或文本转换为二进制流,然后进行加密解密。代码如下: usingSystem; usingSystem.Collections.Generic; usingSystem.IO; usingSystem.Linq; usingSystem.Security.Cryptography; usingSystem.Te...

美团热修复Robust-源码篇

上一篇主要分析了Robust的使用方法,这一篇就来总结一下Robust的源码分析。 我个人倾向于将Robust框架分为两个部分,自动插入代码和动态加载Patch。 一、Robust源码分析 目前我的分析将Robust动态加载分为两个部分,一部分是插桩后的代码逻辑,一部分是拉取Patch的逻辑。 我们首先来看插桩后的代码(这里面套用的是官方的代码,可能有些过...

JSR303校验的基本使用和结合AOP使用

[一]:基本使用 springboot默认导入第三方校验框架hibernate-validator 使用JSR303三大步骤 一.先给需要校验数据的javabean上标注校验注解 public class UmsAdminParam { @ApiModelProperty(value = "用户名", required = true) @L...

基础篇:JAVA.Stream函数,优雅的数据流操作

前言 平时操作集合数据,我们一般都是for或者iterator去遍历,不是很好看。java提供了Stream的概念,它可以让我们把集合数据当做一个个元素在处理,并且提供多线程模式 流的创建 流的各种数据操作 流的终止操作 流的聚合处理 并发流和CompletableFuture的配合使用 关注公众号,一起交流,微信搜一搜: 潜行前行 1 stream的...

[转]从minio中读取文件流进行下载文件

本文转自:https://blog.csdn.net/ZHANGLIZENG/article/details/82892678 一、获取Minio连接public static String minioUrl; public static String minioUsername;public static String minioPassword;@Va...