标签:
摘要:Json数据在安卓开发过程中是非常常见的,在请求服务器端数据的时候,服务器端返回的无非就是三种类型:HTML,XML,JSON。所以学习JSON对安卓程序员来说是非常重要的。
JSON:JavaScript Object Notation。顾名思义,JSON数据是源自于JavaScript,学习过JavaScript(以下简称JS)的人都知道,我们在JS脚本里面创建对象时,都是以键值对的形式编写的。例如,我们在JS里面创建一个Json对象时是这么定义的:
var person = {firstName:"John", lastName:"Doe", age:50, eyeColor:"blue"};
很容易看出,属性之间是通过逗号分隔开,键与值之间是通过双引号分隔开,而JSON数据也是如此。
json一共有两种数据结构。
一种是以 (key/value)对形式存在的无序的jsonObject对象。对象使用大括号括起来,属性之间使用逗号分隔开。
例如:{"name": "jack"}, 这就是一个最简单的json对象,对于这种数据格式,key值必须要是string类型,而对于value,则可以是string、number、object、array等数据类型。
另一种数据格式就是有序的value的集合,这种形式被称为是JsonArray。数组是值的有序集合,值与值之间使用逗号分隔开,集合用中括号括起来。
例如我们要创建以下类型的Jjson数据:
{"person":{"name":"zhangsan", "phone":["123", "456"],"address":"guangdong"}}
/** * 使用JsonObject和JsonArray创建JSON对象 */ public void makeJson() { try { JSONObject object = new JSONObject(); JSONObject person = new JSONObject(); //名字 person.put("name", "zhangsan"); //电话 JSONArray phone = new JSONArray(); phone.put("123").put("456"); person.put("phone", phone); //地址 person.put("address", "guangdong"); object.put("person", person); Log.i("JSON_LOG", object.toString()); } catch (JSONException e) { e.printStackTrace(); } }
输出结果
/** * 通过JsonStringer创建JSON对象 */ public void makeJsonStringer() { try { JSONStringer jsonText = new JSONStringer(); // 首先是{,对象开始。object和endObject必须配对使用 jsonText.object(); jsonText.key("person"); jsonText.object(); jsonText.key("name"); jsonText.value("zhangsan"); jsonText.key("phone"); // 键phone的值是数组。array和endArray必须配对使用 jsonText.array(); jsonText.value("123").value("456"); jsonText.endArray(); jsonText.key("address"); jsonText.value("Guangdong"); jsonText.endObject(); jsonText.endObject(); Log.i("JSON_LOG", jsonText.toString()); } catch (JSONException ex) { throw new RuntimeException(ex); } }
输出结果:
{"person":{"name":"zhangsan", "phone":["123", "456"],"address":"guangdong"}}
解析代码
/** * JSON解析 * @param json * @return */ public static String JsonToString(String json) { Person person = new Person(); try { //获取到整个Json数据 JSONObject object = new JSONObject(json); //解析最外层,获得person键对应的object值 JSONObject personObject = object.getJSONObject("person"); //解析object值里面的每一个属性 person.setName(personObject.getString("name")); //属性值是数组,则使用JSONArray获取 JSONArray phoneArray = personObject.getJSONArray("phone"); List<String> phone = new ArrayList<>(); for (int i = 0; i < phoneArray.length(); i++) { phone.add((String) phoneArray.get(i)); } person.setPhone(phone); person.setAddress(personObject.getString("address")); } catch (JSONException e) { e.printStackTrace(); } return person.toString(); }
结果
{"name":"zhangsan", "phone":["123", "456"],"address":"guangdong"}
这么解析:
/** * 解析单个对象的JSON数据 * @param json * @return */ public static String JsonParse(String json) { Person person = new Person(); try { JSONObject personObject = new JSONObject(json); //解析object值里面的每一个属性 person.setName(personObject.getString("name")); //属性值是数组,则使用JSONArray获取 JSONArray phoneArray = personObject.getJSONArray("phone"); List<String> phone = new ArrayList<>(); for (int i = 0; i < phoneArray.length(); i++) { phone.add((String) phoneArray.get(i)); } person.setPhone(phone); person.setAddress(personObject.getString("address")); } catch (JSONException e) { e.printStackTrace(); } return person.toString(); }
["123", "456", "789"];
解析方法:
/** * 解析数组型的JSON数据 * @param json * @return */ public static List<String> JsonParseToArray(String json){ List<String> list = new ArrayList<>(); try { JSONArray array = new JSONArray(json); for (int i=0; i<array.length(); i++){ list.add((String) array.get(i)); } } catch (JSONException e) { e.printStackTrace(); } return list; }
解析总结
JSON解析无非就是通过JSONObject和JSONArray不断地对数据进行解析,归根结底每一种数据都是可以分解为以上的三种最基本的解析,所以大家只要掌握好JSONObject和JSONArray,即便再复杂的数据类型,大家也可以解析得得心应手。
GSON是Google开发的开源的JAVA API,可以用于JSON的创建和JSON的解析。下面对GSON做一个最基本的介绍。更多了解http://sites.google.com/site/gson/
首先需要下载GSON的jar包,自行度娘。
其次,我们使用GSON来创建JSON和解析JSON都要有相对应的JavaBean,所以GSON可以帮助我们更加简便地实现Bean和JSON的转换。
以下例子我们都是用Person类的JavaBean:
public class Person { private String name; private List<String> phone; private String address; public Person() { } public Person(String name, List<String> phone, String address) { this.name = name; this.phone = phone; this.address = address; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List<String> getPhone() { return phone; } public void setPhone(List<String> phone) { this.phone = phone; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", phone=" + phone + ", address='" + address + '\'' + '}'; } }
/** * GSON转换为JSON * * @return json */ public String beanToJson() { //赋值给一个person实例 List<String> phone = new ArrayList<>(); phone.add("123"); phone.add("456"); Person person = new Person("jack", phone, "Guangzhou"); //实例化GSON Gson gson = new Gson(); //调用gson.toJson将Bean转为JSON String json = gson.toJson(person); return json; }
/** * JSON转换为Bean * @param json * @return */ public String jsonToBean(String json) { Person person = new Person(); Gson gson = new Gson(); //调用gson.fromJson将json转为bean person = gson.fromJson(json, Person.class); return person.toString(); }
标签:
原文地址:http://blog.csdn.net/ljcitworld/article/details/51916227