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

本文介绍了如何在Android中解析包含特殊key(仅数字)的JSON数组,通过GsonFormat自动生成JavaBean类,并展示了三层解析过程:主类、包含JSON对象和数组的类以及内部的JSON对象类。解析过程中详细解释了每一步的操作,并提供了示例代码,演示了如何将JSON数据转换为Java对象。

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

各位看官们,大家好,上一回中咱们说的是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: JavaBeanSpecial{age=20, list=ListBean{_$0=_$0Bean{id=33, name='Jack'}, _$1=_$1Bean{id=98, name='Nik'}}}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

talk_8

真诚赞赏,手有余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值