Android_JSON解<一>

转载自这里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


 
 

 
 







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值