前面【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 】
发表评论