欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java数据解析之JSON

程序员文章站 2022-07-11 09:17:11
文章大纲 一、JSON介绍二、常见框架介绍与实战三、Studio中GsonFormat插件使用四、项目源码下载(含参考资料)五、参考文档 一、JSON介绍 1. 简介 JSON 的全称是 JavaScript Object Notation,是一种轻量级的数据交换格 式。 2. 特点 (1)JSON ......

文章大纲

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

 
Java数据解析之JSON

一、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 页面,点击设置按钮

 
Java数据解析之JSON

点击 plugins 按钮

 
Java数据解析之JSON

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

 
Java数据解析之JSON

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

 
Java数据解析之JSON

 

重启一下 android studio

在 android studio 中创建一个类

 
Java数据解析之JSON

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

 
Java数据解析之JSON

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

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

五、参考文档

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