Android中JSON解析

来源:互联网 发布:菲律宾做网络推广经历 编辑:程序博客网 时间:2024/04/29 00:34


Android中JSON解析

JSON是JavaScript Object Notation的缩写,可见JSON来源于JavaScript。JSON数据是一系列键值对的集合。

JSON和XML的比较

  • JSON比XML体积小
  • JSON和JavaScript交互更加方便
  • JSON对数据的描述性没有XML好
  • JSON的速度要远远大于XML
  • JSON的解析要比XML的解析要方便

JSON已经被大多数开发人员所接受,在网络数据的传输当中应用非常广泛


下面的代码就是一个JSON:

{  "phone" : ["12345678", "87654321"], // 数组  "name" : "tianjiefeng", // 字符串  "age" : 100, // 数值  "address" : { "country" : "china", "province" : "jiangsu" }, // JSON对象  "married" : false // 布尔值  }
JSON是以key/value的形式存在的,key是Strng类型的,value的类型可以是一个数组,可以是一个字符串,可以是一个数值,也可以是一个布尔值,甚至可以是一个JSON对象


一、JSONObject的创建

我们先来看一个Demo,把上面的JSON对象创建出来,并且写入存储卡文件

既然要写入存储卡,那么就必须在AndroidManifest.xml中加入一下权限

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

接着在JSONCreateDemoActivity.java里面编写如下代码:

package com.tianjf;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.PrintStream;import org.json.JSONArray;import org.json.JSONException;import org.json.JSONObject;import android.app.Activity;import android.os.Bundle;import android.os.Environment;public class JSONCreateDemoActivity extends Activity {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);// 不存在不操作if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {// 返回到程序的被调用出return;}// 将JSON对象写入存储卡writeJSONObjectToSdCard(createJSONObject());}// 创建以下的JSON对象// {// "phone" : ["12345678", "87654321"], // 数组// "name" : "tianjiefeng", // 字符串// "age" : 100, // 数值// "address" : { "country" : "china", "province" : "jiangsu" }, // JSON对象// "married" : false // 布尔值// }private JSONObject createJSONObject() {// 最外层是{},也就是一个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;}/** * 将JSON对象写入存储卡 *  * @param person * @throws FileNotFoundException */private void writeJSONObjectToSdCard(JSONObject person) {File file = new File(Environment.getExternalStorageDirectory() + File.separator + "json"+ File.separator + "json.txt");// 文件夹不存在的话,就创建文件夹if (!file.getParentFile().exists()) {file.getParentFile().mkdirs();}// 写入内存卡PrintStream outputStream = null;try {outputStream = new PrintStream(new FileOutputStream(file));outputStream.print(person.toString());} catch (FileNotFoundException e) {e.printStackTrace();} finally {if (outputStream != null) {outputStream.close();}}}}

运行一下,打开File Explorer视图,打开mnt - sdcard - json目录,将里面的json.txt导出到计算机里面,就可以看到JSON对象以字符串的形式成功写入到了json.txt文件中


二、JSONObject的解析

直接将字符串转化为JSONObject对象来解析的Demo

package com.tianjf;import java.util.HashMap;import java.util.Map;import org.json.JSONException;import org.json.JSONObject;import android.app.Activity;import android.os.Bundle;import android.util.Log;public class JSONParseDemoActivity extends Activity {private static final String JSONString = "{" + "\"phone\":[\"12345678\",\"87654321\"],"+ "\"name\":\"tianjiefeng\"," + "\"age\":100,"+ "\"address\":{\"country\":\"china\",\"province\":\"jiangsu\"},"+ "\"married\":false" + "}";@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);// 解析得到一个Map对象Map<String, Object> personMap = parseJSONString(JSONString);Log.d("debug","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解析 *  * @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如下


用JsonReader来读取JSON字符串的内容

打开Android帮助文档找到JsonReader,会发现Since: API Level 11(3.0),也就是说3.0之前的SDK是没有JsonReader的。如果要对应3.0之前的版本,可以到Google的网站上去下载gson的jar包(URL:http://code.google.com/p/google-gson/downloads/list )。jar包导入项目的流程如下:

  1. 新建libs文件夹,把下载的jar包添加到libs文件夹中
  2. 右键gson-1.6.jar --> Build Path --> Add to Build Path(add操作之后就会看到Package视图下的Referenced Libraries下多了个gson-1.6.jar,说明jar包添加成功) 

添加好了jar包,我们就可以使用JsonReader了。具体代码如下

JSONUtils.java

package com.tianjf;import java.io.StringReader;import com.google.gson.stream.JsonReader;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()) {// 取出当前键值对的keyString tagName = reader.nextName();// 取出key所对应的valueif (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();}}}

JSONParseDemoActivity.java

package com.tianjf;import android.app.Activity;import android.os.Bundle;public class JSONParseDemoActivity extends Activity {private static final String JSONString = "[{\"name\":\"Michael\",\"age\":20},{\"name\":\"Mike\",\"age\":21}]";@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);JSONUtils jsonUtils = new JSONUtils();jsonUtils.parseJson(JSONString);}}

这个例子是解析[{"name":"Michael","age":20},{"name":"Mike","age":21}]这个JSON字符串

先分析一下这个JSON字符串的结构:一个JSONArray里面有两个JSONObject

再分析一下JsonReader解析这个JSON字符串的流程:

  1. 遇到【[】,开始解析数组(reader.beginArray())
  2. 遇到【{】,开始解析对象(reader.beginObject())
  3. 遇到【"】,开始解析第一个键值对
  4. 遇到【"】,开始解析第二个键值对
  5. 遇到【}】,结束解析对象(reader.endObject())
  6. 遇到【{】,开始解析对象(reader.beginObject())
  7. 遇到【"】,开始解析第一个键值对
  8. 遇到【"】,开始解析第二个键值对
  9. 遇到【}】,结束解析对象(reader.endObject())
  10. 遇到【]】,结束解析数组(reader.endArray())


Gson类的fromJson方法自动解析并自动得到一个Entity对象,代码如下

User.java

package com.tianjf;public class User {private String name ;private int age ;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;}}

JSONUtils.java

package com.tianjf;import com.google.gson.Gson;public class JSONUtils {public void parseUserFromJson(String jsonData) {Gson gson = new Gson();// Gson的fromJson方法是一 一对应的关系,自动将JSON的数据匹配到User对象中User user = gson.fromJson(jsonData, User.class);System.out.println("name--->" + user.getName());System.out.println("age---->" + user.getAge());}}

JSONParseDemoActivity.java

package com.tianjf;import android.app.Activity;import android.os.Bundle;public class JSONParseDemoActivity extends Activity {private static final String JSONString = "{\"name\":\"Michael\",\"age\":20}";@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);JSONUtils jsonUtils = new JSONUtils();jsonUtils.parseUserFromJson(JSONString);}}

上面的例子只有一个JSONObject对象,如果有多个对象怎么做到直接映射到一个User的List里面呢?代码如下

User.java

同上


JSONUtils.java

package com.tianjf;import java.lang.reflect.Type;import java.util.Iterator;import java.util.LinkedList;import com.google.gson.Gson;import com.google.gson.reflect.TypeToken;public class JSONUtils {public void parseUserFromJson(String jsonData) {Type listType = new TypeToken<LinkedList<User>>() {}.getType();Gson gson = new Gson();LinkedList<User> users = gson.fromJson(jsonData, listType);Iterator<User> iterator = users.iterator();while (iterator.hasNext()) {User user = (User) iterator.next();System.out.println("name--->" + user.getName());System.out.println("age---->" + user.getAge());}}}

JSONParseDemoActivity.java

package com.tianjf;import android.app.Activity;import android.os.Bundle;public class JSONParseDemoActivity extends Activity {private static final String JSONString = "[{\"name\":\"Michael\",\"age\":20},{\"name\":\"Mike\",\"age\":21}]";@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);JSONUtils jsonUtils = new JSONUtils();jsonUtils.parseUserFromJson(JSONString);}}

0 0
原创粉丝点击