Android中Json文件解析

本文介绍了JSON文件在网络数据传输中的重要性,并详细讲解了两种常见的JSON文件解析方式:使用系统自带的JSONObject类和Gson库。此外,还演示了如何利用Gson进行数据对象到JSON字符串的转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  Json文件在网络数据传输中可以说是最常使用的数据格式,因此在我们的日常开发中,对于Json文件格式的解析以及转换可以说是非常重要的,因此在这介绍以下对于Json文件格式的解析以及各种转换方式。

Json文件介绍

{ "code": 200,
  "msg": "OK", 
  "muser": [
        {"name": "zhangsan","age": "10","phone": "11111","email":"11111@11.com"},
        {"name": "lisi","age": "20","phone": "22222","email": "22222@22.com"},
        ...]
}

  由上面可以看出JSON数据就是一段字符串而已,只不过有不同意义的分隔符将其分割开来而已,我们看上面的符号,里面有[] ,{}等符号,其中:

  • []中括号代表的是一个数组;
  • {}大括号代表的是一个对象
  • 双引号“”表示的是属性值
  • 冒号:代表的是前后之间的关系,冒号前面是属性的名称,后面是属性的值,这个值可以是基本数据类型,也可以是引用数据类型。

  而对于Json文件的解析,主要有以下两种方式:

  • JSONObject——系统自带的解析方式解析
  • Gson解析

JSONObject——系统自带的解析方式解析

  要使用系统自带的解析方式的话,那么首先要熟悉JSONObject系统类中的方法:
      在这里插入图片描述
Json文件格式:

{ "code": 200,
  "msg": "OK", 
  "muser": [
        {"name": "zhangsan","age": "10","phone": "11111","email":"11111@11.com"},
        {"name": "lisi","age": "20","phone": "22222","email": "22222@22.com"},
        ...]
}

  拿到一个Json文件,我们首先就要分析它的结构,比如上诉这个,由上面的符号标志可知,这里面包含了一个总的Object对象,然后里面有一个muser数组,数组中又有n个Object对象,因此,根据这些信息,我们可以将其解析出来:
解析代码如下:

//实体类,主要得到muser数组中的各object中的各个属性的值
public class UserBean {
    //变量名跟JSON数据字段名必须一致
    private String name ;
    private String age;
    private String phone;
    private String email;
    ...
}

public void JsonUtil(String jsonString){
 ArrayList<UserBean> userBeanList = new ArrayList<>();
try {
            JSONObject jsonObject = new JSONObject(jsonString);  //得到总的Object对象
            int code = jsonObject.getInt("code");                      //得到code的值
            String msg = jsonObject.getString("msg");                  //得到msg的值
            JSONArray jsonArray = jsonObject.getJSONArray("muser");    // 返回json的muser数组
            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject jsonObject2 = jsonArray.getJSONObject(i);   //得到muser数组中的各个对象
                UserBean userBean = new UserBean();
                userBean.setName(jsonObject2.getString("name"));
                userBean.setAge(jsonObject2.getString("age"));
                userBean.setPhone(jsonObject2.getString("phone"));
                userBean.setEmail(jsonObject2.getString("Email"));
                userBeanList.add(userBean);
            }
        } catch (Exception e) {
            // TODO: handle exception
        }
 }

  上诉就是使用系统自带的Json解析来解析Json文件的方法,看起来有点复杂,但是理解了的话,还是比较简单的,当然,下面的方式会更加的简单,毕竟如果官方的更好用,那么也不会有人用下面的方式了。

Gson解析

  使用Gson解析的话,因为不是系统带的包,所以需要自己去下载Gson包,因此:

  • 对于Eclipse的话,需要自己去网上找到对应的包。
  • 对于Androidstudio的话,很简单,直接在build.gradle(注意是app的,不是project的)中依赖添加:implementation ‘com.google.code.gson:gson:2.7’,然后同步一下就可以了。

  对于解析Json数据的话,Gson主要有方法Gson fromJson() ,它可以直接将一个Json文件转化成实体类,然后我们通过取出实体类的属性就实现了数据的读取。
  当然有解析,那必须有转化成Json数据的方法,那就是Gson toJson()方法,它可以将你的实体类中添加的数据转换成一个Json文件,下面就将介绍这两个方法:

Gson toJson() 方法

  Gson toJson() 方法那可以说是简单粗暴,不论你的实体类多么复杂,比如包含了String、int、map、list、内部类等,对于toJson方法来说,只要你把数据添加进去了,那么一句gson.toJson(“要转化的实体类”)直接满足你的要求。
比如示例数据结构定义:

public class Student {
     public int id;
     public String nickName;
     public int age;
     public ArrayList<String> books;
     public HashMap<String, String> booksMap;
}
  • 对于简单数据结构
Student student = new Student();
student.id = 1;
student.nickName = "Jack";
student.age = 22;
student.email = "tr@qq.com";
Gson gson = new Gson();
Log.e("MainActivity", gson.toJson(student));

  打印输出:
{"email":"tr@qq.com","nickName":" Jack ","id":1,"age":22}

  • 对于基本数据类型,还包含List集合
Student student = new Student();
student.id = 1;
student.nickName = " Jack ";
student.age = 22;
student.email = "965266509@qq.com";
ArrayList<String> books = new ArrayList<String>();
books.add("数学");
books.add("语文");
books.add("英语");
books.add("物理");
books.add("化学");
books.add("生物");
student.books = books;
Gson gson = new Gson();
Log.e("MainActivity", gson.toJson(student));

  打印输出:
{"books":["数学","语文","英语","物理","化学","生物"],"email":"965266509@qq.com","nickName":" Jack ","id":1,"age":22}

  • 对于基本数据类型,还包含了List和Map集合
Student student = new Student();
student.id = 1;
student.nickName = "Jack";
student.age = 22;
student.email = "965266509@qq.com";
ArrayList<String> books = new ArrayList<String>();
books.add("数学");
books.add("语文");
books.add("英语");
books.add("物理");
books.add("化学");
books.add("生物");
student.books = books;
HashMap<String, String> booksMap = new HashMap<String, String>();
booksMap.put("1", "数学");
booksMap.put("2", "语文");
booksMap.put("3", "英语");
booksMap.put("4", "物理");
booksMap.put("5", "化学");
booksMap.put("6", "生物");
student.booksMap = booksMap;
Gson gson = new Gson();
Log.e("MainActivity", gson.toJson(student));

  打印输出:
{"books":["数学","语文","英语","物理","化学","生物"],"booksMap":{"3":"英语","2":"语文","1":"数学","6":"生物","5":"化学","4":"物理"},"email":"965266509@qq.com","nickName":"Jack","id":1,"age":22}

Gson fromJson() 方法

使用fromJson的方法对于各种不同的Json文件数据有不同的方法:

纯数组JSON

  Json文件:

	[ {"name": "zhangsan","age": "10","phone": "11111","email": "11111@11.com"},
      {"name": "lisi","age": "20","phone": "22222","email": "22222@22.com"},
  ...]

  解析代码如下:

//实体类
public class UserBean {
    //变量名跟JSON数据字段名必须一致
    private String name ;
    private String age;
    private String phone;
    private String email;
    ...
}

  解析方法:

public void JsonUtil(String jsonString){
 ArrayList<UserBean> userBeanList = new ArrayList<>();
 //Json的解析类对象
 JsonParser parser = new JsonParser();
 //将JSON的String 转成一个JsonArray对象
 JsonArray jsonArray = parser.parse(jsonString).getAsJsonArray();
 Gson gson = new Gson();
 //加强for循环遍历JsonArray
 for (JsonElement user : jsonArray) {
        //使用GSON,直接转成Bean对象
        UserBean userBean = gson.fromJson(user, UserBean.class);
        userBeanList.add(userBean);
     }
 }

有数据头的纯数组

  Json文件格式:

	{"muser": 
	       [
	       {"name": "zhangsan","age": "10","phone": "11111","email": "11111@11.com"},
           {"name": "lisi","age": "20","phone": "22222","email": "22222@22.com"},
           ...]
}

  解析方法:

public void JsonUtil(String jsonString){
    ArrayList<UserBean> userBeanList = new ArrayList<>();
    JSONObject jsonObject = new JSONObject(jsonString);  //得到总的Object对象
    JSONArray jsonArray = jsonObject.getJSONArray("muser");    // 返回json的muser数组
    Gson gson = new Gson();
    //循环遍历
    for (JsonElement user : jsonArray) {
        //通过反射 得到UserBean.class
        UserBean userBean = gson.fromJson(user, new TypeToken<UserBean>() {}.getType());
        userBeanList.add(userBean);
}

有数据头的复杂数据转换

  前面的两种Json数据的解析让你看起来会觉得Gson也并没有那么方便啊,跟系统自带的方法差距也就是少点代码而以啊,说的没问题,但是Gson的简便主要在于复杂数据的解析,当然现在我们获取的数据大多都是复杂数据,因此下面你将看到Gson最大的威力。
  Json文件格式:

   { "code": 200,"msg": "OK",
     "muser": [{"name": "zhangsan","age": "10","phone": "11111","email":"11111@11.com"},
               {"name": "lisi","age": "20","phone": "22222","email": "22222@22.com"},
           ...]
}

  被解析对象不是纯数组数据,还有其它字段+数组(含头),方法如下:
   根据 JSON 建立Bean,注意这里的 Bean 是返回所有字段,因为 GSON 能直接解析成 List ,所以 Bean可以这样定义,(get/set方法省略):

public class ResultBean {
   //注意变量名与字段名必须一致
   private int code;
   private String msg;
   private List<UserBean> muser;
   public class UserBean{
       private String name ;
       private String age;
       private String phone;
       private String email;
       ...
   }
   ...
}

  有消息头复杂数据的解析方法如下:

public void JsonUtil(String jsonString){
   ResultBean resultBean = new Gson().fromJson(jsonString,ResultBean.class);
   //对象中拿到集合
   int code = resultBean.getCode();                      //得到code的值
   String msg = resultBean.getMsg();                  //得到msg的值
   List<ResultBean.UserBean> userBeanList = resultBean.getMuser();
}

  四句话搞定得到所有的值,由此看出GSON的强大。这种方法也是我们最常用的方法,而且在Androidstudio中有个GsonFormat插件,它能帮助你将Json数据直接转化成实体类,可以说是十分的方便,当然对于实在是复杂的数据,建议还是多定义几个实体类,不然一个实体类会很臃肿。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值