• 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 = "{
    " +                
                            "	"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 页面,点击设置按钮

     

    点击 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
  • 相关阅读:
    左滑删除 --- 自定义组件(优化)
    扩展方法
    关于Windows服务中的一点小记录
    MySQL数据库方面
    反射初探
    FireDAC读取数据Delphi
    Delphi学习之 FireDAC
    向ComboBox列表框中添加Enum的全部数据
    怎样在VC中生成一个DLL
    AutoCAD 开发备注
  • 原文地址:https://www.cnblogs.com/WUXIAOCHANG/p/10657050.html
Copyright © 2020-2023  润新知