Android JSON 解析

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值