记一次难忘的Json解析经历

作者: 暗尘随码去 | 来源:发表于2017-08-11 08:07 被阅读0次

解析Json数据想必对于每一位开发者都熟悉的不能再熟悉,说到解析工具,那肯定也是萝卜青菜各有所爱,时下流行的fastjson,Gson,JSONObject等等想必大家都各有所长。

说到解析,我想最重要的就是构建Model类了,不过自从有了GsonFormat这个工具之后,就再也不用那么麻烦的手动定义一个个字段,重写get,set方法等等。

但是呢,这样的解析对我们的Json数据格式要求比较严格,有的服务端返回的数据格式随心所欲,一层层的嵌套不说,主要是每个字段对应的key值还是不确定的,虽然之前也遇到过这样的数据,也不需要建立模型,利用JSONObject就能解析到想要的数据,但鉴于这次的数据相对复杂,就码点文字记录下。

另类之处:1.N层嵌套 2.数据的key值不确定

先上图来看看这组数据

9D53E10C-6D1A-45B8-8382-30202F2991C5.png

箭头上面的是非常标准的格式不管用那种方法解析起来肯定都是非常简单的,那我们就直接从箭头下面的数据看,

json.gif

展开data数组瞬间懵逼,这里面是什么?仔细观察发现里面有两种数据类型,type=0时,里面有一个数组但是他的key不是固定的,这里有cb1,cb2,cb3.
type=1时,里面就是一个字符串,同样他的key是变化的,ddl,ddl2,ddl3.....ddln.

既然有两类数据,那我们就分开解析,首先看type=1时相对简单,我们就从这组数据开始解析。

type=1,key值不确定 解析方法:

  • 关键代码
     public void parseData(String result) {
        headData = new ArrayList<String>();
        keyData = new ArrayList<String>();
        try {
            JSONObject jsonObject = new JSONObject(result);
            JSONArray jsonArray = jsonObject.getJSONArray("data");
//            遍历data数组
            for(int i=0;i<jsonArray.length();i++){
                JSONObject lan = jsonArray.getJSONObject(i);
//                利用迭代器取出所有不确定的key值
                Iterator<String> keys = lan.keys();
                while (keys.hasNext()){
                    String key = String.valueOf(keys.next());
//                    通过key值才得到对应的value值
                    String value = lan.getString(key);
                    if(value.length()>1){
//                        value不为空时将value值存进headData集合,就是我们要用的
                        headData.add(value);
//                        如果这些不确定的key也有需要的话,也将他们存进集合里面
                        keyData.add(key);
                    }
                }
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
  • headData和keyData.add是两个集合我们用来存放到的String值和那些不确定的key值(如果有用的话)

type=0,key值不确定 解析方法:

  • 关键代码
  public void parseData(String result) {
        headData = new ArrayList<String>();
        bodyData = new ArrayList<String>();
        keyData = new ArrayList<String>();
        keyBodyData = new ArrayList<String>();
        try {
            JSONObject jsonObject = new JSONObject(result);
            JSONArray jsonArray = jsonObject.getJSONArray("data");
            for(int i=0;i<jsonArray.length();i++){
                JSONObject lan = jsonArray.getJSONObject(i);
                if(lan.getInt("type")==0){
                Log.e(TAG,lan.toString());
                    Iterator<String> keys = lan.keys();
                    while (keys.hasNext()){
                        String key = String.valueOf(keys.next());
                        String value = lan.getString(key);
                        if(value.length()>1){
                            keyBodyData.add(key);
                            cbValue.put(key,value);
                            JSONArray jsonArray1 = lan.getJSONArray(key);
//                            Log.e("DDD",keyBodyData.toString());
                            for (int j=0;j<jsonArray1.length();j++){
                                String item = jsonArray1.getString(j);
//                                Log.e("ITEM",item);
                                bodyData.add(item);
                            }
                        }
                    }
                }
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

其实主要难点还是因为返回的数据key值是变化的,所以只要熟练掌握JSONObject的解析方法,嵌套再复杂的数据解析起来都不是问题。

相关文章

  • 记一次难忘的Json解析经历

    解析Json数据想必对于每一位开发者都熟悉的不能再熟悉,说到解析工具,那肯定也是萝卜青菜各有所爱,时下流行的fas...

  • 记一次奇葩的JSON解析

    记一次奇葩的JSON解析 有些东西,用的多了,会给人一种“我掌握了”的错觉。json就是其中之一:你说你解析过无数...

  • Json解析方式

    1.传统的JSON解析 1.1 生成Json 1.2 解析Json 2.Gson解析Json 2.1生成Json ...

  • 记一次难忘的经历

    还有半个小时下班,太阳正挂在头顶,如火如荼。我找了超市里一个没有人的地方,躲在这里吃着一根五毛钱的雪糕。我的感冒比...

  • 记一次难忘的经历

    上小学的时候,语文课上老师总会说:“来 来来,今天我们要写的作文,题目是《记一次难 忘的经历》,大家要写的真实生...

  • 记一次难忘的经历

    有必要在忘记一些细节之前记录一下。 之前在柏林被偷了钱包,随之一起被偷的还有我的英国签证卡。在丢了签证卡后,一度也...

  • 记一次难忘的经历

    “ 妈妈,我想学游泳!”想必这应该已经是我第101次对妈妈提出这样的要求了。 记得是在三年级,有一段时间我...

  • JSON

    JSON解析(反序列化) JSON解析(序列化) JSON解析补充

  • 记一次json_serializable解析的踩坑经历

    怎么使用json_serializable的文章网上已经很多了,大家可以自行google.这里推荐一篇https:...

  • iOS中解析json格式数据的各种方法调用

    JSON解析的解析过程不重要,重要的是JSON解析之后对结果的处理JSON解析后是个dictionary,但是字典...

网友评论

    本文标题:记一次难忘的Json解析经历

    本文链接:https://www.haomeiwen.com/subject/iwpfrxtx.html