zoukankan      html  css  js  c++  java
  • 核心技术篇:6.android网络编程之json解析

      前言:好一段时间没写博客了,说最近挺忙的,感觉像是个借口,每天还是同样的24个小时,每天还是同样的5:30就准时下班,每天晚上还是有大量的空余时间...最直接的原因就是,最近堕落了。脑子里也时常会有很多想法浮现,都是些比较实际的想法,但往往就是浮现那一下,心情激动了一下,心里默默告诉自己,有时间就要这么做...好多想法都被一些其它的诱惑给磨灭掉了,要么是打球、要么是看电影、要么是处理一些乱七八糟的事去了。总之,近段时间,花在技术上的时间很少很少,好好反思下。

      前段时间,来了一位新疆的客户,提出了一个需求,需求不难实现,只是客户很赶时间,希望在两天内搞出来,想想当时还是年轻气盛,没多想,就答应下来了。其中有一个环节需要与客户的后台进行对接,后台接口返回的数据类型为json,很简单的数据结构,没有嵌很多层。但由于自己之前与后台的对接用的一直都是webservice,突然出来个json,一下子有点蒙了。不过对于json这么常用的数据结构,都没有把握其解析方法,自己也是该好好反思。刚遇到这问题时,想着问题搞完了一定要写一篇博客来好好记录下json的解析方法,以便后期的项目用到时,可以快速上手。但项目过去好一段时间了,博客一直推到了今天才开始写,其中的原因就像开篇说的...

      JSON定义:一种轻量级的数据交换格式,具有良好的可读和快速编写特性,业内主流技术为其提供了完整的解决方案,从而可以在不同平台间进行数据交互。

      JSON解析:在讲解JSON解析方法前,先来了解两个基本概念:

        1.JSONObject:一个基本的json对象,有关json定义的基本单元,说白了,其实就是一堆键值对(key/value),对外体现为一个标准的字符串,如:{"name":"dean"}.最外被大括号包裹,内部的key和value之间用:分隔,value的类型包括:Boolean,JSONArray,JSONObject,Number,String,JSONObject.NULL object.

        2.JSONArray:它代表一组有序的数值,对外的表现形式为:最外层用方括号包裹,数值以逗号,分隔,如:[value1,value2,value3]

      JSON总共有四种数据格式:a.直接对象 b.数组 c.对象里面包含数组 d.数组里面包含数组 其实解析原理都一样,遇到object就可以直接调用object.getString()方法获取value,遇到array就逐个转换为object,再调用object.getString()方法获取value.   下面以代码形式展示具体如何解析JSON:

    //JSON对象直接解析
            btnObjectPaser.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    try {
                        //JSON字符串
                        String json="{"username":"dean","age":23,"addr":"广东省广州市天河区"}";
                        //根据JSON字符串 获得JSON object对象
                        JSONObject jsonObject =new JSONObject(json);
                        //根据key 获取相应的value
                        String str="名字:"+jsonObject.getString("username")+"  年龄:"+jsonObject.getString("age")+"  住址:"+jsonObject.getString("addr")+"
    ";
                        tvShowResult.setText(str);
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            });
            //JSON数组直接解析
            btnArrayPaser.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    try {
                        //JSON字符串
                        String json="[{"username":"dean","age":"23","addr":"广东省广州市天河区"}," +
                                "{"username":"小张","age":"32","addr":"广东省广州市白云区"}]";
                        String str = "";
                        //根据JSON字符串 获得JSON数组
                        JSONArray jsonArray =new JSONArray(json);
                        for(int i=0;i<jsonArray.length();i++){
                            JSONObject jsonObject = (JSONObject)jsonArray.opt(i);//将JSON数组通过opt()函数转换为JSONObject
                            //根据key 获取相应的value
                            str +="名字:"+jsonObject.getString("username")+"  年龄:"+jsonObject.getString("age")+"  住址:"+jsonObject.getString("addr")+"
    ";
                        }
                        tvShowResult.setText(str);
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            });
            //JSON对象里有数组
            btnArrayInObject.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    try {
                        //JSON字符串
                        String json= "{"username":"张木生",age:11,"jicheng":[{"zhengshu":"PMP","date":"2011年"}," +
                                "{"zhengshu":"信息系统项目管理师","date":"2012年"}],"addr":"江西"}";
                        String str = "";
                        //根据JSON字符串 获得JSON对象
                        JSONObject jsonObject =new JSONObject(json);
                        str +="名字:"+jsonObject.getString("username")+"  年龄:"+jsonObject.getString("age");
                        JSONArray jsonArray = new JSONArray(jsonObject.getString("jicheng"));
    
                        for(int i=0;i<jsonArray.length();i++){
                            JSONObject jsonObject2 = (JSONObject)jsonArray.opt(i);//将JSON数组通过opt()函数转换为JSONObject
                            //根据key 获取相应的value
                            str +="证书:"+jsonObject2.getString("zhengshu")+"  日期:"+jsonObject2.getString("date")+";";
                        }
                        str +="地址:"+jsonObject.getString("addr");
                        tvShowResult.setText(str);
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            });
            //JSON数组里有数组
            btnArrayInArray.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    try {
                        //JSON字符串
                        String json="["+
                                "{"devid":"1234567800","gps":[{"time":"2014-11-12","latitude":"29.4963","longitude":"116.189"},{"time":"2014-11-12","latitude":"29.4963","longitude":"116.189" }],"devname":"赣01"},"+
                                " {"devid":"1234567800","gps":[{"time":"2014-11-12","latitude":"29.4963","longitude":"116.189"},{"time":"2014-11-12","latitude":"29.4963","longitude":"116.189" }],"devname":"赣92"},"+
                                " {"devid":"1234567800","gps":[{"time":"2014-11-12","latitude":"29.4963","longitude":"116.189"},{"time":"2014-11-12","latitude":"29.4963","longitude":"116.189" }],"devname":"赣43"}"+
                                "]";
                        String str = "";
                        //根据JSON字符串 获得JSON数组
                        JSONArray jsonArray = new JSONArray(json);
                        for(int i=0;i<jsonArray.length();i++){
                            JSONObject jsonObject = (JSONObject)jsonArray.opt(i);//将JSON数组通过opt()函数转换为JSONObject
                            //根据key 获取相应的value
                            str +="ID:"+jsonObject.getString("devid")+",";
                            //获取第二层数组
                            JSONArray jsonArray2 = new JSONArray(jsonObject.getString("gps"));
    //                        JSONArray jsonArray2 = jsonObject.getJSONArray("gps");//也可以这样获得第二层数组
                            for(int j=0;j<jsonArray2.length();j++){
                                JSONObject jsonObject2 = (JSONObject)jsonArray2.opt(j);
                                str +=" GPS时间:"+jsonObject2.getString("time")+" GPS经度:"+jsonObject2.getString("latitude")+" GPS维度:"+jsonObject2.getString("longitude")+";";
                            }
                            str +=" 设备名称:"+jsonObject.getString("devname")+".";
                        }
                        tvShowResult.setText(str);
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            });

      

  • 相关阅读:
    OpenLayer学习之图文标注
    HTML5制作时钟(canvas)
    ADO,NET中简单三层SQLHelper封装介绍
    OpenLayer学习之加载天地图
    ArcGIS Server manger管理页面无法打开问题解决
    Java EE (14) -- SSH配置
    R语言实战读书笔记(一)R语言介绍
    Machine Learning for hackers读书笔记_一句很重要的话
    Machine Learning for hackers读书笔记(十二)模型比较
    Machine Learning for hackers读书笔记(十)KNN:推荐系统
  • 原文地址:https://www.cnblogs.com/dream550/p/4854930.html
Copyright © 2011-2022 走看看