Android JSON 解析

来源:互联网 发布:我的世界起床战争端口 编辑:程序博客网 时间:2024/05/16 06:04

json

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

JSON格式详解

JSON有三种结构

1. JSON对象

JSON对象简单而言便是键值对或名值对,而“值”可以是数值、字符串和布尔类型等。

这里写图片描述
1. JSON 数值

    单个数值{“value”:12}      多个数值{"maxValue":24, "minValue":12};
  1. JSON 字符串 字符串需要加引号,键值对之间使用”,”。
    {"name":"y874961524"}    {"name":"y874961524", "blog":"http://blog.csdn.net/y874961524"}
  1. JSON 布尔 请注意JSON格式中的值可以使用布尔类型,且不需要加引号,如果true或false被引号包裹,那么便解析为JSON字符串,请处理稍有不同。
    {"success":false}

2. JSON数组

JSON数组的表达方法和C语言数组的表达方法完全相同。
下面的例子中存在一个JSON对象,该JSON对象只有一个键值对,键为lists而键值为JSON数组——[5,6,7,8]。
这里已经存在JSON类型的嵌套,具体请看下面一个例子。
{“lists”:[5,6,7,8]}

IMG[JSON_ARRAY]

3. JSON对象和数组锲套

JSON格式可以嵌套,所谓嵌套便是JSON对象中可包括JSON数组,JSON数组中可包括JSON对象。下面的例子中rows为JSON对象,
对象中嵌套JSON数组,每一个JSON数组的元素又是一个JSON对象。这种嵌套情况在实际情况中经常出现。

{   "total": 3,       "rows": [           {               "title": "树莓派学习笔记——索引博文",               "url": "http://blog.csdn.net/xukai871105/article/details/23115627"           },           {               "title": "树莓派学习笔记——GPIO功能学习",               "url": "http://blog.csdn.net/xukai871105/article/details/12684617"           },           {               "title": "物联网学习笔记——索引博文",               "url": "http://blog.csdn.net/xukai871105/article/details/23366187"           }       ]   };  

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。

JSONArray

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

JSONTokener

json解析类

JSONException

json中用到的异常

解析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}

Android解析JSON示例

public class MainActivity extends ActionBarActivity {    private TextView mTvText;    private TextView mTvRes;    private String jsonStr;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mTvText = (TextView) findViewById(R.id.id_tv_text);        mTvRes = (TextView) findViewById(R.id.id_tv_result);        File f = new File("sdcard/DownLoad/json.txt");        try {            // 读取json数据,并指定编码(在inputStreamReader中设置编码)            BufferedReader br = new BufferedReader(new InputStreamReader(                    new FileInputStream(f), "GB2312"));            jsonStr = br.readLine();            mTvText.setText("json: " + jsonStr);            br.close();            // 进行json解析            JSONObject jsonObj = new JSONObject(jsonStr);            JSONArray jsonArr = jsonObj.getJSONArray("result");            // 获取JSON数组中的第一个JSON对象            JSONObject resObj = jsonArr.getJSONObject(0);            StringBuilder sb = new StringBuilder("解析后的部分JSON数据\n");            // 只取出部分数据用作测试            sb.append("城市 : " + resObj.getString("city") + "\n");            sb.append("质量 : " + resObj.getString("quality") + "\n");            sb.append("时间 : " + resObj.getString("time") + "\n");            mTvRes.setText(sb.toString());        } catch (Exception e) {            mTvText.setText(e.getMessage());            e.printStackTrace();        }    }}

这里写图片描述

0 0