好记性不如铅笔头

android, java, 编程

Android应用开发笔记:JSON解析

前面【Http】【获取天气】之后,就可以通过JSON解析来获取可用的天气信息。JSON解析备忘如下:

CONTENTS

1)通过JSONObject解析JSON天气字符串

网络返回:{“weatherinfo”:{“city”:”南京”,”cityid”:”101190101″,”temp”:”17″,”WD”:”北风”,”WS”:”1级”,”SD”:”58%”,”WSE”:”1″,”time”:”22:20″,”isRadar”:”1″,”Radar”:”JC_RADAR_AZ9250_JB”}}

public static class WeatherInfo implements Serializable
{
	private static final long serialVersionUID = 9142206968689527358L;
	public String city = null;
	public int cityId = 0;
	public int curr_temp = 0;
	public String wind = null;
	public String sd = null;//湿度
	public int weatherid = 0;
	}
}

public static WeatherInfo FmtWeatherFromJson(String jsonStr)
{
	if (null == jsonStr || jsonStr.trim().length() == 0)
		return null;
	
	WeatherInfo info = new WeatherInfo();
	
	try
	{
		JSONObject jsonObj = new JSONObject(jsonStr).getJSONObject("weatherinfo");
		info.city = jsonObj.getString("city");
		info.cityId = jsonObj.getInt("cityid");
		info.curr_temp = jsonObj.getInt("temp");
		info.sd = jsonObj.getString("SD");
		info.weatherid = jsonObj.getInt("WSE");
		info.wind = jsonObj.getString("WD") + jsonObj.getString("WS"); 
	} 
	catch (JSONException e)
	{
		info = null;
		Log.e("", jsonStr + "parse error");
		e.printStackTrace();
	}
	return info;
}
备注:代码很简单,可以根据JSON字符串来逐步的分析json的解析,就不在详细备忘了。

2)JSONObject的简单说明

1)新建一个Person类以及它的实例

public class Person
{
	private String name;
	private int age;
	private boolean	 gender;
	private String [] friends;
//get && set
}

Person a = new Person("xiao ming", 10, true, new String[]{"x","y"});
Person b = new Person("xiao ming", 10, true, new String[]{"x","y"});
Person[] persons = new Person[]{a,b};
ListpersonList = new ArrayList();
personList.add(a);
personList.add(b);

2)生成及解析JSON

单个元素生成

JSONArray friendJsonArray = new JSONArray();//friends是一个数组
JSONObject personAJson = new JSONObject();
personAJson.put("name", a.getName());
personAJson.put("age", a.getAge());
personAJson.put("gender", a.isGender());
personAJson.put("friends", friendJsonArray.put(a.getFriends()[0]).put(a.getFriends()[1]));//将jsonarray作为一个元素放到jsonobject里面
String str = personAJson.toString();
//str==> {"gender":true,"friends":["x","y"],"age":10,"name":"xiao ming"}

 单个元素解析

JSONObject jsonObject = new JSONObject(str);
String name = jsonObject.getString("name");
JSONArray friArray = jsonObject.getJSONArray("friends");
name =(String)friArray.get(0);

 数组生成

JSONArray AfriendJsonArray = new JSONArray();
JSONObject ApersonAJson = new JSONObject();
ApersonAJson.put("name", a.getName());
ApersonAJson.put("age", a.getAge());
ApersonAJson.put("gender", a.isGender());
ApersonAJson.put("friends", AfriendJsonArray.put(a.getFriends()[0]).put(a.getFriends()[1]));

JSONArray BfriendJsonArray = new JSONArray();
JSONObject BpersonAJson = new JSONObject();
BpersonAJson.put("name", b.getName());
BpersonAJson.put("age", b.getAge());
BpersonAJson.put("gender", b.isGender());
BpersonAJson.put("friends", BfriendJsonArray.put(b.getFriends()[0]).put(b.getFriends()[1]));			

JSONArray TotalArray = new JSONArray();
TotalArray.put(ApersonAJson).put(BpersonAJson);
String strTotal1 = TotalArray.toString();
//strTotal1==>[{"gender":true,"friends":["x","y"],"age":10,"name":"xiao ming"},{"gender":false,"friends":["c","v"],"age":11,"name":"xiao li"}]

JSONObject TotalObj = new JSONObject();
TotalObj.put("persons", TotalArray);
String strTotal2 = TotalObj.toString();
//strTotal2==>{"persons":[{"gender":true,"friends":["x","y"],"age":10,"name":"xiao ming"},{"gender":false,"friends":["c","v"],"age":11,"name":"xiao li"}]}

从生成的strTotal1和strTotal2上可以看出JsonObject和JsonArray的区别,这里就不描述了。

数组的解析

JSONArray arr = new JSONArray(strTotal1);
JSONObject item1 = (JSONObject)arr.get(0);
//item1==>{"gender":true,"name":"xiao ming","age":10,"friends":["x","y"]}
String name1 = item1.getString("name");
//name1==>xiao ming

JSONObject obj = new JSONObject(strTotal2);
String arrStr = obj.getString("persons");
//arrStr==>[{"gender":true,"name":"xiao ming","age":10,"friends":["x","y"]},{"gender":false,"name":"xiao li","age":11,"friends":["c","v"]}]

3)使用Gson

可以看出,当元素有多个以及元素的属性较多的时候,写代码生成和解析比较麻烦。下面备忘下Gson的使用方式

1)下载Gson的jar包

访问地址【 http://code.google.com/p/google-gson/downloads/list 】下载Jar包,并放入android工程的libs目录下

2)使用Gson生成json字符串

Gson gson = new Gson();
String strA = gson.toJson(a);
//strA==>{"name":"xiao ming","friends":["x","y"],"gender":true,"age":10}
String strPersons1 = gson.toJson(persons);
//strPersons1==>[{"name":"xiao ming","friends":["x","y"],"gender":true,"age":10},{"name":"xiao li","friends":["c","v"],"gender":false,"age":11}]
String strPersons2 = gson.toJson(personList);
//strPersons2==>[{"name":"xiao ming","friends":["x","y"],"gender":true,"age":10},{"name":"xiao li","friends":["c","v"],"gender":false,"age":11}]
//strPersons1和strPersons2相同

3)使用Gson解析json字符串:

Person person = gson.fromJson(strA, Person.class);
List<Person> ps1 = gson.fromJson(strPersons1, new TypeToken<List<Person>>(){}.getType());
for(int i = 0; i < ps1.size() ; i++)
{
     Person p = ps1.get(i);
}
Person[] ps2 = gson.fromJson(strPersons1, Person[].class);

备注:

1)通过代码可以看出,使用Gson可以减少很多代码。

2)关于Gson的原理,不是很清楚,后面需要学习。

3)备忘代码写的很乱,后续需要整理并放入GitHub。

4)关于json字符串的格式【 http://www.cnblogs.com/menlsh/archive/2013/05/14/3078948.html 】

5)其他参考

http://yuanzhifei89.iteye.com/blog/1141385 】

http://blog.csdn.net/lilu_leo/article/details/7000077 】

http://my.oschina.net/dsm/blog/143233 】

http://www.cnblogs.com/haippy/archive/2012/05/20/2509329.html 】

http://www.itstrike.cn/Question/373054e7-ca69-431b-8eac-cd1e1c384904 】

发表评论

2 × 4 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据