转载自这里http://blog.csdn.net/tianjf0514/article/details/7570607加入了我自己的理解和修改
JSON是JavaScript Object Notation的缩写,可见JSON来源于JavaScript。JSON数据是一系列键值对的集合。
JSON和XML的比较
- JSON比XML体积小
- JSON和JavaScript交互更加方便
- JSON对数据的描述性没有XML好
- JSON的速度要远远大于XML
- JSON的解析要比XML的解析要方便
JSON已经被大多数开发人员所接受,在网络数据的传输当中应用非常广泛
可以在这个网址下看到JSON更详细的定义http://www.json.org。
{
"phone" : ["12345678", "87654321"], // 数组
"name" : "tianjiefeng", // 字符串
"age" : 100, // 数值
"address" : { "country" : "china", "province" : "jiangsu" }, // JSON对象
"married" : false // 布尔值
}
</pre><pre name="code" class="html"><span style="font-family: Arial; font-size: 14px; line-height: 26px;">JSON是以key/value的形式存在的,key是Strng类型的,value的类型可以是一个数组,可以是一个字符串,可以是一个数值,也可以是一个布尔值,甚至可以是一个JSON对象</span>
android支持JSON的解析和创建,提供了JSONObject。还可以使用JSONReader和JSONWriter来解析
还可以使用google提供的gson类来解析。接下来分别说说这三种方法。
1.JSON的创建:
/*{
"phone" : ["18050369001", "15008470337"], // 数组
"name" : "yzw", // 字符串
"age" : 21, // 数值
"address" : { "country" : "china", "province" : "jiangsu" }, // JSON对象
"married" : false // 布尔值
}*/
package com.example.jsonparse;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("info", createJSONObject().toString());
}
// 创建以下的JSON对象
// {
// "phone" : ["12345678", "87654321"], // 数组
// "name" : "tianjiefeng", // 字符串
// "age" : 100, // 数值
// "address" : { "country" : "china", "province" : "jiangsu" }, // JSON对象
// "married" : false // 布尔值
// }
public JSONObject createJSONObject() {
// 新建一个JSONObject对象,一个{}里面的内容就表示一个JSONObject对象
JSONObject person = new JSONObject();
try {
// 第1个value是[ ],也就是一个JSONArray对象
JSONArray phone = new JSONArray();
phone.put("12345678");
phone.put("87654321");
person.put("phone", phone);
// 第2个value一个字符串
person.put("name", "tianjiefeng");
// 第3个value一个字符串数值
person.put("age", 100);
// 第4个value一个JSONObject对象
JSONObject address = new JSONObject();
address.put("country", "china");
address.put("province", "jiangsu");
person.put("address", address);
// 第5个value一个布尔值
person.put("married", false);
} catch (JSONException e) {
e.printStackTrace();
}
return person;
}
}
</pre><pre name="code" class="java">运行后会看到打印输出{"phone":["12345678","87654321"],"name":"tianjiefeng","age":100,"address":{"country":"china","province":"jiangsu"},"married":false}
JSONObject成功生成,被以字符串的形式打印出来。
</pre><pre name="code" class="java">
2.解析JSON字符串:
2.1直接使用JSONObject来解析JSON字符串
/*{
"phone" : ["18050369001", "15008470337"], // 数组
"name" : "yzw", // 字符串
"age" : 21, // 数值
"address" : { "country" : "china", "province" : "jiangsu" }, // JSON对象
"married" : false // 布尔值
}*/
package com.example.jsonparse;
import java.util.HashMap;
import java.util.Map;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String s = createJSONObject().toString();
//创建一个JSON对象并打印
Log.i("info", s);
//解析JSON字符串
// 解析得到一个Map对象
Map<String, Object> personMap = parseJSONString(s);
Log.i("info",
"phone:" + personMap.get("phone") + "\n" + "name:" + personMap.get("name") + "\n"
+ "age:" + personMap.get("age") + "\n" + "address:"
+ personMap.get("address") + "\n" + "married:" + personMap.get("married"));
}
// 创建以下的JSON对象
// {
// "phone" : ["12345678", "87654321"], // 数组
// "name" : "tianjiefeng", // 字符串
// "age" : 100, // 数值
// "address" : { "country" : "china", "province" : "jiangsu" }, // JSON对象
// "married" : false // 布尔值
// }
public JSONObject createJSONObject() {
// 新建一个JSONObject对象,一个{}里面的内容就表示一个JSONObject对象
JSONObject person = new JSONObject();
try {
// 第1个value是[ ],也就是一个JSONArray对象
JSONArray phone = new JSONArray();
phone.put("12345678");
phone.put("87654321");
person.put("phone", phone);
// 第2个value一个字符串
person.put("name", "tianjiefeng");
// 第3个value一个字符串数值
person.put("age", 100);
// 第4个value一个JSONObject对象
JSONObject address = new JSONObject();
address.put("country", "china");
address.put("province", "jiangsu");
person.put("address", address);
// 第5个value一个布尔值
person.put("married", false);
} catch (JSONException e) {
e.printStackTrace();
}
return person;
}
/**
* 用JSONObject直接解析JSON字符串
* @param JSONString
* @return
*/
private Map<String, Object> parseJSONString(String JSONString) {
Map<String, Object> resultMap = new HashMap<String, Object>();
try {
// 直接把JSON字符串转化为一个JSONObject对象
JSONObject person = new JSONObject(JSONString);
// 第1个键值对
resultMap.put("phone", person.getJSONArray("phone").toString());
// 第2个键值对
resultMap.put("name", person.getString("name"));
// 第3个键值对
resultMap.put("age", person.getInt("age"));
// 第4个键值对
resultMap
.put("address", person.getJSONObject("address").toString());
// 第5个键值对
resultMap.put("married", person.getBoolean("married"));
} catch (JSONException e) {
e.printStackTrace();
}
return resultMap;
}
}
打印出log的信息如下:
说明成功从JSON字符串中解析出来JSON数据。
2.2使用JSONReader来解析
打开Android帮助文档找到JsonReader,会发现Since: API Level 11(3.0),也就是说3.0之前的SDK是没有JsonReader的。
如果要使用请把api的版本最低定位API Level 11。当然使用gson的话,在3.0以前也可以使用。这个在下一篇说明。
package com.example.jsonparse;
import java.io.StringReader;
import android.util.JsonReader;
//[{"name":"Michael","age":20},{"name":"Mike","age":21}]
//解析这个字符串
public class JSONUtils {
public void parseJson(String jsonData) {
try {
// 如果需要解析JSON数据,首要要生成一个JsonReader对象
JsonReader reader = new JsonReader(new StringReader(jsonData));
// 开始解析数组
reader.beginArray();
// 判断数组里面还有没下一个JSONObject对象
while (reader.hasNext()) {
// 开始解析对象
reader.beginObject();
// 判断当前JSONObject对象里面还有没下一个键值对
while (reader.hasNext()) {
// 取出当前键值对的key
String tagName = reader.nextName();
// 取出key所对应的value
if (tagName.equals("name")) {
System.out.println("name--->" + reader.nextString());
} else if (tagName.equals("age")) {
System.out.println("age--->" + reader.nextInt());
}
}
// 结束解析对象
reader.endObject();
}
// 结束解析数组
reader.endArray();
} catch (Exception e) {
e.printStackTrace();
}
}
}
</pre><pre name="code" class="java"><pre name="code" class="java">package com.example.jsonparse;
import java.util.Map;
import org.json.JSONException;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends Activity {
// 这里\"name\"中的\"是转义字符
private static final String JSONString = "[{\"name\":\"Michael\",\"age\":20},{\"name\":\"Mike\",\"age\":21}]";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String s = JSONObjectDemo.createJSONObject().toString();
/*
* //创建一个JSON对象并打印 Log.i("info", s); //解析JSON字符串 // 解析得到一个Map对象
* Map<String, Object> personMap = JSONObjectDemo.parseJSONString(s);
* Log.i("info", "phone:" + personMap.get("phone") + "\n" + "name:" +
* personMap.get("name") + "\n" + "age:" + personMap.get("age") + "\n" +
* "address:" + personMap.get("address") + "\n" + "married:" +
* personMap.get("married"));
*/
// 用JSonReader解析
JSONUtils jsonUtils = new JSONUtils();
jsonUtils.parseJson(JSONString);
}
}
</pre><pre name="code" class="java">打印后输出:
<img src="https://img-blog.csdn.net/20150205174633844" alt="" />
下一篇 介绍用GSON来解析JSON