JSON 解析

    JSON 使用讲解 这篇文章讲解了,JSON的介绍以及使用GSON解析。今天,我们就在Android项目中使用两种方式解析JSON数据。如果你对JSON,还不熟悉,那么请看JSON 使用讲解

一.搭建服务以及制造JSON数据。

1.服务器选择的Tomcat,下载链接。下载安装成功后,服务启动后,在浏览器中输入'http://localhost:8080/',看到如下截图,那就说明启动成功了。

2.Tomcat服务器启动好后,找到它的安装目录‘D:\Apache Software Foundation\Tomcat 6.0\webapps’(我的安装目录是 ‘D:\Apache Software Foundation\Tomcat 6.0\webapps’),然后在该目录下,新建文件夹‘json’,在该文件夹中,创建文件‘get_data.json’,在该文件中输入JSON字符串,格式如下‘[{"id":1,"name":"zhangsan","age":30},{"id":2,"name":"lisi","age":20}]’。

3.此时在浏览器中输入‘http://localhost:8080/json/get_data.json’,如果出现如下截图,说明上面的操作是成功的。

    经过上面3步,我们就把JSON数据创建好了,接下来就是Android客户端的实现了。

二.Android客户端的实现。

1.创建Android项目。这个不用详细描述了。

2.首先记得在AndroidManifest.xml中加入网络权限。

 

<uses-permission android:name="android.permission.INTERNET"/>

3.网络请求实现。使用URLConnection实现的。

 

 

public static String getData1(String urlStr) {
		String resultData = "";
		// 构造URL
		try {
			URL url = new URL(urlStr);
			// 打开连接
			URLConnection con = url.openConnection();
			con.setConnectTimeout(10 * 1000);
			con.setReadTimeout(10 * 1000);
			InputStream is = con.getInputStream();
			BufferedReader br = new BufferedReader(new InputStreamReader(is));
			String line = null;
			StringBuffer sb = new StringBuffer();
			while ((line = br.readLine()) != null) {
				sb.append(line);
			}
			resultData=sb.toString();
			return resultData;
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

4.功能实现。

 

    在MainActivity中加入一个按钮,点击的时候获取网络数据,并且请求网络要在子线程中进行。有一点需要补充就是手机访问电脑时的IP地址,如果你使用手机访问电脑,IP地址还是‘localhost’,肯定是访问不了的,因为‘localhost’指的是本机,如果使用手机访问‘localhost’,那肯定是访问不到电脑的。这个IP可以有两种写法,一种是,当你使用模拟器访问的话,IP可以写成‘10.0.2.2’;另一种是,直接写为电脑在局域网内的IP地址,例如‘192.168.1.114’(我电脑的IP地址);建议直接写成电脑在局域网内的IP地址。详细实现如下代码所示,

 

public class MainActivity extends Activity {

	String url = "http://192.168.1.114:8080/json/get_data.json";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		findViewById(R.id.btn_getdata).setOnClickListener(
				new OnClickListener() {

					@Override
					public void onClick(View v) {
						// TODO Auto-generated method stub
						new MyThread().start();
					}
				});
	}

	class MyThread extends Thread {
		@Override
		public void run() {
			String jsonStr = NetWorkUtils.getData1(url);
			if (!TextUtils.isEmpty(jsonStr)) {
				Log.e("jsonStr", jsonStr);
				 parseJsonData(jsonStr);
//				parseJsonData1(jsonStr);
			}
		}
	}
}

解析JSON采用三种方式。

 

5.使用JSONObject解析。代码很简单,就不多说了,示例如下,

 

/**
	 * 使用JSONArray和JSONObject解析
	 * 
	 * @param jsonStr
	 */
	private void parseJsonData(String jsonStr) {
		try {
			JSONArray array = new JSONArray(jsonStr);
			for (int i = 0; i < array.length(); i++) {
				JSONObject jsonObject = array.getJSONObject(i);
				int id = jsonObject.getInt("id");
				String name = jsonObject.getString("name");
				int age = jsonObject.getInt("age");
				Person person = new Person(id, name, age);
				Log.e("person", person.toString());
			}
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

6.使用GSON解析。代码就更简单,示例如下,

/**
	 * 使用GSON解析
	 * 
	 * @param jsonStr
	 */
	private void parseJsonData1(String jsonStr) {
		Gson gson = new Gson();
		List<Person> list = gson.fromJson(jsonStr,
				new TypeToken<List<Person>>() {
				}.getType());
		for (Person person : list) {
			Log.e("person", person.toString());
		}
	}

 

7.使用JackJson解析,做了一个JackJson工具类,代码如下:

 

/**
 * jackjson 
 */
public class JackJsonUtils {

	
	/**
	 * 解析
	 * 
	 * @param content
	 * @param valueType
	 * @return
	 */
	public static <T> T fromJson(String content, Class<T> valueType) {
			ObjectMapper objectMapper = new ObjectMapper();
		try {
			return objectMapper.readValue(content, valueType);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 生成json
	 * 
	 * @param object
	 * @return
	 */
	public static String toJSon(Object object) {
		ObjectMapper objectMapper = new ObjectMapper();
		try {
			return objectMapper.writeValueAsString(object);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
}

调用代码,

 

 

	/**
	 * jackjson解析
	 * 
	 * @param jsonStr
	 */
	public void parserByJackJson(String jsonStr) {
		Person[] persons = JackJsonUtils.fromJson(jsonStr, Person[].class);
		for (Person person : persons) {
			Log.e("person", person.toString());
		}
	}

 

运行后的截图如下,

PS:也许你使用JackJson解析可能会报错,日志截图如下:

解决方法是,在你的实体类中加入无参的构造函数就完美解决了!希望能帮到你!实体类的代码如下:

 

public class Person implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private int id;
	private String name;
	private int age;

	public Person() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Person(int id, String name, int age) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
	}

}

 

三.总结。

    使用了三种方式去解析JSON数据。个人建议,如果你是在Android开发,建议使用GSON,毕竟是谷歌自己的东西,使用放心,可靠!如果你是做后台服务或者接口开发,建议使用JackJson,强大、快速!相信你现在已经对JSON解析有更深入的了解了!示例代码下载链接

PS:推荐文章 java web开发(一) 环境搭建 

                      Android学习资料整理                     

                     Android WebView(一) WebView详解

                     json格式化工具

 

最近才开通了微信公众号,欢迎大家关注。

 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值