一起Talk Android吧(第三百五十回:解析JSON数组五)

Posted talk_8

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一起Talk Android吧(第三百五十回:解析JSON数组五)相关的知识,希望对你有一定的参考价值。

各位看官们,大家好,上一回中咱们说的是android中解析JSON对象的例子,这一回中咱们介绍的例子是解析JSON数组。闲话休提,言归正转。让我们一起Talk Android吧!

看官们,本章回中我们将介绍特殊的JSON数组,此数组和上一章回中解析的混合数组类似,特殊之处在于key的string没有英文,只有数字,生成的JavaBean类比较特殊。下面是一个示例数据,请大家参考:

"age":20,"list":"0":"id":33,"name":"Jack","1":"id":98,"name":"Nik"

注意一下key的值为0和1这样的字符串,不带有英文字符。这里涉及三种解析:普通标量解析、JSON对象解析、JSON数组解析。和解析混合数组一样使用分层的思路进行解析。

分层思路:
使用GsonFormat创建JavaBean类,先解析主类再解析子类,也就是从外到内一层一层地解析.这个示例中包含三层(最外层一个主类,主类中包含两个子类)

  • 第一层解析获取JSON对象 ;
  • 第二层解析获取获取JSON对象和JSON数组;
  • 第三层解析是从第二层解析到的JOSON数组中获取JSON对象

这里的解析思路也是使用了分层思路,特殊之处在于转换成Java对象时,内部类的名称比较特殊。因为JSON数据的key中只有数字没有英文,因此GsonFormat工具自动生成了特殊的内部类名:_$1Bean,详细可以查看示例程序中代码。如果觉得这样的名字不好,可以自己手动修改。下面是示例程序,程序中包含GsonFormat自动生成的JavaBean类和解析程序:

import com.google.gson.annotations.SerializedName;
public class JavaBeanSpecial 
    /**
     * age : 20
     * list : "0":"id":33,"name":"Jack","1":"id":98,"name":"Nik"
     */
    private int age;
    private ListBean list;

    public int getAge() 
        return age;
    

    public void setAge(int age) 
        this.age = age;
    

    public ListBean getList() 
        return list;
    

    public void setList(ListBean list) 
        this.list = list;
    

    public static class ListBean 
        /**
         * 0 : "id":33,"name":"Jack"
         * 1 : "id":98,"name":"Nik"
         */

        @SerializedName("0")
        private _$0Bean _$0;
        @SerializedName("1")
        private _$1Bean _$1;

        public _$0Bean get_$0() 
            return _$0;
        

        public void set_$0(_$0Bean _$0) 
            this._$0 = _$0;
        

        public _$1Bean get_$1() 
            return _$1;
        

        public void set_$1(_$1Bean _$1) 
            this._$1 = _$1;
        

        public static class _$0Bean 
            /**
             * id : 33
             * name : Jack
             */

            private int id;
            private String name;

            public int getId() 
                return id;
            

            public void setId(int id) 
                this.id = id;
            

            public String getName() 
                return name;
            

            public void setName(String name) 
                this.name = name;
            

            @Override
            public String toString() 
                return "_$0Bean" +
                        "id=" + id +
                        ", name='" + name + '\\'' +
                        '';
            
        

        public static class _$1Bean 
            /**
             * id : 98
             * name : Nik
             */

            private int id;
            private String name;

            public int getId() 
                return id;
            

            public void setId(int id) 
                this.id = id;
            

            public String getName() 
                return name;
            

            public void setName(String name) 
                this.name = name;
            

            @Override
            public String toString() 
                return "_$1Bean" +
                        "id=" + id +
                        ", name='" + name + '\\'' +
                        '';
            
        

        @Override
        public String toString() 
            return "ListBean" +
                    "_$0=" + _$0 +
                    ", _$1=" + _$1 +
                    '';
        
    

    @Override
    public String toString() 
        return "JavaBeanSpecial" +
                "age=" + age +
                ", list=" + list +
                '';
    



   private void parseJsonSpecialByJavaNative() 
        String jsonDataStr = "\\"age\\":20,\\"list\\":\\"0\\":\\"id\\":33,\\"name\\":\\"Jack\\",\\"1\\":\\"id\\":98,\\"name\\":\\"Nik\\"\\n";

       try 
           JSONObject jsonObject = new JSONObject(jsonDataStr);
           //解析第一层
           int age = jsonObject.optInt("age");
           JSONObject jsonObjectLevel1 = jsonObject.optJSONObject("list");

           //解析第二层,注意这里的key是数字,不包含英文
           JSONObject jsonObjectLevel2_1 = jsonObjectLevel1.optJSONObject("0");
           JSONObject jsonObjectLevel2_2 = jsonObjectLevel1.optJSONObject("1");

           //解析第三层,同时转换第三层
           JavaBeanSpecial.ListBean._$0Bean special1 = new JavaBeanSpecial.ListBean._$0Bean();
           special1.setId(jsonObjectLevel2_1.optInt("id"));
           special1.setName(jsonObjectLevel2_1.optString("name"));

           JavaBeanSpecial.ListBean._$1Bean special2 = new JavaBeanSpecial.ListBean._$1Bean();
           special2.setId(jsonObjectLevel2_2.optInt("id"));
           special2.setName(jsonObjectLevel2_2.optString("name"));

           //转换第二层
           JavaBeanSpecial.ListBean listBean = new JavaBeanSpecial.ListBean();
           listBean.set_$0(special1);
           listBean.set_$1(special2);

           //转换第一层
           JavaBeanSpecial javaBeanSpecial = new JavaBeanSpecial();
           javaBeanSpecial.setAge(age);
           javaBeanSpecial.setList(listBean);

           Log.d(TAG, "parseJsonSpecialByJavaNative: "+javaBeanSpecial.toString());
        catch (JSONException e) 
           e.printStackTrace();
       

   

编译并且运行上面的程序,可以得到以下解析后的结果:

parseJsonSpecialByJavaNative: JavaBeanSpecialage=20, list=ListBean_$0=_$0Beanid=33, name='Jack', _$1=_$1Beanid=98, name='Nik'

看官们,关于Android中解析JSON数组的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!

以上是关于一起Talk Android吧(第三百五十回:解析JSON数组五)的主要内容,如果未能解决你的问题,请参考以下文章

一起Talk Android吧(第三百五十七回:Gson库解析JSON数据总结)

一起Talk Android吧(第三百五十八回:Gson库解析Java对象)

一起Talk Android吧(第三百五十二回:Gson库解析JSON对象)

一起Talk Android吧(第三百五十三回:Gson库解析JSON数组一)

一起Talk Android吧(第三百五十九回:Gson库解析 VS JAava原生解析)

一起Talk Android吧(第三百五十六回:Gson库解析JSON数组四)