json
JavaScript 对象表示法(JavaScript Object Notation)。独立于语言和平台,
比 XML 更小、更快,更易解析。如今JSON数据已经成为了互联网中大多数数据的传递方式,所以必须要熟练掌握。
JSON格式详解
JSON有三种结构
1. JSON对象
JSON对象简单而言便是键值对或名值对,而“值”可以是数值、字符串和布尔类型等。
1. JSON 数值
单个数值{“value”:12}
多个数值{"maxValue":24, "minValue":12};
- JSON 字符串 字符串需要加引号,键值对之间使用”,”。
{"name":"y874961524"}
{"name":"y874961524", "blog":"http://blog.csdn.net/y874961524"}
- 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]}
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();
}
}
}