坑爹后台-json数据key和value未知的解析

在开始正题之前,我们先来提一个业务:获取所有客户的账号和名称

按照正常的逻辑思维我们会生成怎么样的json数据呢,我们大部分人会这样生成:

{
    "allCustomer": [
        {
            "account": "zhangsan",
            "name": "张三"
        },
        {
            "account": "lisi",
            "name": "李四"
        }
    ]
}

可是有的坑爹的后台生成什么样的呢?如下:

{
    "allCustomer": [
        {
            "zhangsan": "张三",
            "lisi": "李四"
        }
    ]
}

对比以上两组json数据,发现什么没有,第二组的数据当中的json数组完全就是浪费的、没有意义的;我已经给了建议,在这样的业务逻辑下不应该给出这样的json数据,这样也导致了json对象数组当中的json对象元素的key和value值都是未知,对于前端而言,解析是相对要绕一点的事情,本来建一个实体类:

public class Test {

    private List<AllCustomerBean> allCustomer;

    public List<AllCustomerBean> getAllCustomer() {
        return allCustomer;
    }

    public void setAllCustomer(List<AllCustomerBean> allCustomer) {
        this.allCustomer = allCustomer;
    }

    public static class AllCustomerBean {
        /**
         * account : zhangsan
         * name : 张三
         */

        private String account;
        private String name;

        public String getAccount() {
            return account;
        }

        public void setAccount(String account) {
            this.account = account;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
}
就可以通过Gson直接解析到位,可是坑爹的后台给出了那样的json格式,好吧,跟他说了建议他不听,教他合理的做法也不听,没办法咯,谁叫Java比PHP强大百条街呢,一直接触php写的后台,感觉php就是一个。。。很随便,怎么样都行的那种。。。回归正题,修改我们以上的实体类:

public class Test {

    private List<JsonElement> allCustomer;

    public List<JsonElement> getAllCustomer() {
        return allCustomer;
    }

    public void setAllCustomer(List<JsonElement> allCustomer) {
        this.allCustomer = allCustomer;
    }
}
这里我们能看到,我把AllCustomerBean内部类去掉了,替换成了JsonElement这个json元素类,为什么要这样替换呢,分析如下:我们来看看json数组里面的东西
 {
   "zhangsan": "张三",
   "lisi": "李四"
 }
这个单独看就是一个json对象是吧,可是又因为 key和value是不确定,因为key值不一定永远叫zhangsan和lisi,所以用JsonElement这个json元素类来装这样的数据,JsonElement可以装各种各样的json数据格式。

以下是对后台返回数据的解析过程,取出key和value的值:

public void resole() {
    String json = "{\n" +
            "    \"allCustomer\": [\n" +
            "        {\n" +
            "            \"zhangsan\": \"张三\",\n" +
            "            \"lisi\": \"李四\"\n" +
            "        }\n" +
            "    ]\n" +
            "}";
    Gson gson = new Gson();
    Test test = gson.fromJson(json,Test.class);
    if (test != null &&
            test.getAllCustomer().size() > 0 &&
            test.getAllCustomer().get(0) != null) {
        try {
            JSONObject object = new JSONObject(test.getAllCustomer().get(0).toString());
            Iterator<String> iterator = object.keys();
            while (iterator.hasNext()) {
                String key = iterator.next();
                String value = object.get(key).toString();
                Log.e("key-value","key:"+key+" value:"+value);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}
其中json这个变量是模拟从后台获取到的json数据了;注意:JSONObject是org.json包中JSONObject类,跟JsonElement的包是不一样的。

好了,以上解析过程就是核心代码,以后遇到有key和value都是变动的情况下,就可以通过以上的方式进行解析。













评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

TenTenXu

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值