在开始正题之前,我们先来提一个业务:获取所有客户的账号和名称
按照正常的逻辑思维我们会生成怎么样的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都是变动的情况下,就可以通过以上的方式进行解析。