JSON: JavaScript 对象表示法(JavaScript Object Notation)。独立于语言和平台,比 XML 更小、更快,更易解析。如今JSON数据已经成为了互联网中大多数数据的传递方式,所以必须要熟练掌握。

Android平台自带了JSON解析的相关API,可以将文件、输入流中的数据转化为JSON对象,然后从对象中获取JSON保存的数据内容。

Android的JSON解析部分都在包org.json下,主要有以下几个类:

JSONObject: 可以看作是一个json对象,这是系统中有关JSON定义的基本单元,其包含一对儿(Key/Value)数值。它对外部(External:应用toString()方法输出的数值)调用的响应体现为一个标准的字符串(例如:{“JSON”: “Hello, World”},最外被大括号包裹,其中的Key和Value被冒号”:”分隔)。其对于内部(Internal)行为的操作格式略微,例如:初始化一个JSONObject实例,引用内部的put()方法添加数值:new JSONObject().put(“JSON”, “Hello, World!”),在Key和Value之间是以逗号”,”分隔。Value的类型包括:Boolean、JSONArray、JSONObject、Number、String或者默认值JSONObject.NULL object。

JSONStringer: json文本构建类 ,根据官方的解释,这个类可以帮助快速和便捷的创建JSON text。其最大的优点在于可以减少由于 格式的错误导致程序异常,引用这个类可以自动严格按照JSON语法规则(syntax rules)创建JSON text。每个JSONStringer实体只能对应创建一个JSON text。。其最大的优点在于可以减少由于格式的错误导致程序异常,引用这个类可以自动严格按照JSON语法规则(syntax rules)创建JSON text。每个JSONStringer实体只能对应创建一个JSON text。

JSONArray: 它代表一组有序的数值。将其转换为String输出(toString)所表现的形式是用方括号包裹,数值以逗号”,”分隔(例如:[value1,value2,value3],大家可以亲自利用简短的代码更加直观的了解其格式)。这个类的内部同样具有查询行为,get()和opt()两种方法都可以通过index索引返回指定的数值,put()方法用来添加或者替换数值。同样这个类的value类型可以包括:Boolean、JSONArray、JSONObject、Number、String或者默认值JSONObject.NULL object。

JSONTokener: json解析类
JSONException: json中用到的异常

JSON示例:

{ /*JSONObject*/
     "resultcode": "200",
     "reason": "SUCCESSED!",
     "result": [ /*JSONArray*/
         { /*JSONObject*/
             "city": "苏州",  /*城市*/
             "PM2.5": "73",  /*PM2.5指数*/
             "AQI": "98",    /*空气质量指数*/
             "quality": "良", /*空气质量*/
             "PM10": "50",/*PM10*/
             "CO": "0.79",  /*一氧化碳*/
             "NO2": "65",  /*二氧化氮*/
             "O3": "28",    /*臭氧*/
             "SO2": "41",  /*二氧化硫*/
             "time": "2014-12-26 11:48:40"/*更新时间*/  
         }
     ],
     "error_code": 0
 }

把以上文本存到text.json,放到asserts文件夹底下

1.读取:

public String getFromAssets(String fileName){
        try {
            String Result="";
            InputStream in =  getResources().getAssets().open(fileName);
            //获取文件的字节数
            int lenght = in.available();
            //创建byte数组
            byte[]  buffer = new byte[lenght];
           //将文件中的数据读到byte数组中
            in.read(buffer);
            //转码
            Result=new String(buffer,"GB2312");

            return Result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

2.解码:

String result = getFromAssets("text.json");
        try {
            JSONObject jsonObject = new JSONObject(result);
            int resultCode = jsonObject.getInt("resultcode");
            if(resultCode == 200)
            {
                JSONArray jsonArray = jsonObject.getJSONArray("result");
                JSONObject resultJsonObject = jsonArray.getJSONObject(0);
                String city = resultJsonObject.optString("city","utf-8");
                String pm25 = resultJsonObject.getString("PM2.5");
                String aqi = resultJsonObject.getString("AQI");
                String quality = resultJsonObject.getString("quality");
                String pm10 = resultJsonObject.getString("PM10");
                String co = resultJsonObject.getString("CO");
                String no2 = resultJsonObject.getString("NO2");
                String o3 = resultJsonObject.getString("O3");
                String so2 = resultJsonObject.getString("SO2");
                String time = resultJsonObject.getString("time");
                Log.e("JSON","city = "+city+",pm25 = "+pm25+",aqi = "+aqi+",quality = "+quality+",pm10 = "+pm10+
                ",co = "+co+",no2 = "+no2+",o3 = "+o3+",so2 = "+so2+",time = "+time);
            }
        } catch (JSONException e) {
            Log.e("JSON","e = "+e.getMessage());
            e.printStackTrace();
        }