Android解析Json语言 JDBC编程

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

JSON和XML的比较

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

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

下面的代码就是一个JSON:

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. {    
  2. "phone" : ["12345678", "87654321"], // 数组    
  3. "name" : "tianjiefeng", // 字符串    
  4. "age" : 100, // 数值    
  5. "address" : { "country" : "china", "province" : "jiangsu" }, // JSON对象    
  6. "married" : false // 布尔值    
  7. }  
JSON是以key/value的形式存在的,key是Strng类型的,value的类型可以是一个数组,可以是一个字符串,可以是一个数值,也可以是一个布尔值,甚至可以是一个JSON对象


一、JSONObject的创建

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

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

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  

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

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.tianjf;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileNotFoundException;  
  5. import java.io.FileOutputStream;  
  6. import java.io.PrintStream;  
  7.   
  8. import org.json.JSONArray;  
  9. import org.json.JSONException;  
  10. import org.json.JSONObject;  
  11.   
  12. import android.app.Activity;  
  13. import android.os.Bundle;  
  14. import android.os.Environment;  
  15.   
  16. public class JSONCreateDemoActivity extends Activity {  
  17.     @Override  
  18.     public void onCreate(Bundle savedInstanceState) {  
  19.         super.onCreate(savedInstanceState);  
  20.         setContentView(R.layout.main);  
  21.   
  22.         // 判断sdcard存不存在,不存在不操作  
  23.         if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {  
  24.             // 返回到程序的被调用出  
  25.             return;  
  26.         }  
  27.   
  28.         // 将JSON对象写入存储卡  
  29.         writeJSONObjectToSdCard(createJSONObject());  
  30.     }  
  31.   
  32.     // 创建以下的JSON对象  
  33.     // {  
  34.     // "phone" : ["12345678", "87654321"], // 数组  
  35.     // "name" : "tianjiefeng", // 字符串  
  36.     // "age" : 100, // 数值  
  37.     // "address" : { "country" : "china", "province" : "jiangsu" }, // JSON对象  
  38.     // "married" : false // 布尔值  
  39.     // }  
  40.     private JSONObject createJSONObject() {  
  41.         // 最外层是{},也就是一个JSONObject对象  
  42.         JSONObject person = new JSONObject();  
  43.         try {  
  44.             // 第1个value是[ ],也就是一个JSONArray对象  
  45.             JSONArray phone = new JSONArray();  
  46.             phone.put("12345678");  
  47.             phone.put("87654321");  
  48.             person.put("phone", phone);  
  49.             // 第2个value一个字符串  
  50.             person.put("name""tianjiefeng");  
  51.             // 第3个value一个字符串数值  
  52.             person.put("age"100);  
  53.             // 第4个value一个JSONObject对象  
  54.             JSONObject address = new JSONObject();  
  55.             address.put("country""china");  
  56.             address.put("province""jiangsu");  
  57.             person.put("address", address);  
  58.             // 第5个value一个布尔值  
  59.             person.put("married"false);  
  60.         } catch (JSONException e) {  
  61.             e.printStackTrace();  
  62.         }  
  63.         return person;  
  64.     }  
  65.   
  66.     /** 
  67.      * 将JSON对象写入存储卡 
  68.      *  
  69.      * @param person 
  70.      * @throws FileNotFoundException 
  71.      */  
  72.     private void writeJSONObjectToSdCard(JSONObject person) {  
  73.         File file = new File(Environment.getExternalStorageDirectory() + File.separator + "json"  
  74.                 + File.separator + "json.txt");  
  75.         // 文件夹不存在的话,就创建文件夹  
  76.         if (!file.getParentFile().exists()) {  
  77.             file.getParentFile().mkdirs();  
  78.         }  
  79.         // 写入内存卡  
  80.         PrintStream outputStream = null;  
  81.         try {  
  82.             outputStream = new PrintStream(new FileOutputStream(file));  
  83.             outputStream.print(person.toString());  
  84.         } catch (FileNotFoundException e) {  
  85.             e.printStackTrace();  
  86.         } finally {  
  87.             if (outputStream != null) {  
  88.                 outputStream.close();  
  89.             }  
  90.         }  
  91.     }  
  92. }  

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


二、JSONObject的解析

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

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.tianjf;  
  2.   
  3. import java.util.HashMap;  
  4. import java.util.Map;  
  5.   
  6. import org.json.JSONException;  
  7. import org.json.JSONObject;  
  8.   
  9. import android.app.Activity;  
  10. import android.os.Bundle;  
  11. import android.util.Log;  
  12.   
  13. public class JSONParseDemoActivity extends Activity {  
  14.   
  15.     private static final String JSONString = "{" + "\"phone\":[\"12345678\",\"87654321\"],"  
  16.             + "\"name\":\"tianjiefeng\"," + "\"age\":100,"  
  17.             + "\"address\":{\"country\":\"china\",\"province\":\"jiangsu\"},"  
  18.             + "\"married\":false" + "}";  
  19.   
  20.     @Override  
  21.     public void onCreate(Bundle savedInstanceState) {  
  22.         super.onCreate(savedInstanceState);  
  23.         setContentView(R.layout.main);  
  24.   
  25.         // 解析得到一个Map对象  
  26.         Map<String, Object> personMap = parseJSONString(JSONString);  
  27.         Log.d("debug",  
  28.                 "phone:" + personMap.get("phone") + "\n" + "name:" + personMap.get("name") + "\n"  
  29.                         + "age:" + personMap.get("age") + "\n" + "address:"  
  30.                         + personMap.get("address") + "\n" + "married:" + personMap.get("married"));  
  31.     }  
  32.   
  33.     /** 
  34.      * JSON解析 
  35.      *  
  36.      * @param JSONString 
  37.      * @return 
  38.      */  
  39.     private Map<String, Object> parseJSONString(String JSONString) {  
  40.         Map<String, Object> resultMap = new HashMap<String, Object>();  
  41.         try {  
  42.             // 直接把JSON字符串转化为一个JSONObject对象  
  43.             JSONObject person = new JSONObject(JSONString);  
  44.             // 第1个键值对  
  45.             resultMap.put("phone", person.getJSONArray("phone").toString());  
  46.             // 第2个键值对  
  47.             resultMap.put("name", person.getString("name"));  
  48.             // 第3个键值对  
  49.             resultMap.put("age", person.getInt("age"));  
  50.             // 第4个键值对  
  51.             resultMap.put("address", person.getJSONObject("address").toString());  
  52.             // 第5个键值对  
  53.             resultMap.put("married", person.getBoolean("married"));  
  54.         } catch (JSONException e) {  
  55.             e.printStackTrace();  
  56.         }  
  57.         return resultMap;  
  58.     }  
  59. }  

运行之后打印出来的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

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.tianjf;  
  2.   
  3. import java.io.StringReader;  
  4.   
  5. import com.google.gson.stream.JsonReader;  
  6.   
  7. public class JSONUtils {  
  8.     public void parseJson(String jsonData) {  
  9.         try {  
  10.             // 如果需要解析JSON数据,首要要生成一个JsonReader对象  
  11.             JsonReader reader = new JsonReader(new StringReader(jsonData));  
  12.             // 开始解析数组  
  13.             reader.beginArray();  
  14.             // 判断数组里面还有没下一个JSONObject对象  
  15.             while (reader.hasNext()) {  
  16.                 // 开始解析对象  
  17.                 reader.beginObject();  
  18.                 // 判断当前JSONObject对象里面还有没下一个键值对  
  19.                 while (reader.hasNext()) {  
  20.                     // 取出当前键值对的key  
  21.                     String tagName = reader.nextName();  
  22.                     // 取出key所对应的value  
  23.                     if (tagName.equals("name")) {  
  24.                         System.out.println("name--->" + reader.nextString());  
  25.                     } else if (tagName.equals("age")) {  
  26.                         System.out.println("age--->" + reader.nextInt());  
  27.                     }  
  28.                 }  
  29.                 // 结束解析对象  
  30.                 reader.endObject();  
  31.             }  
  32.             // 结束解析数组  
  33.             reader.endArray();  
  34.         } catch (Exception e) {  
  35.             e.printStackTrace();  
  36.         }  
  37.     }  
  38. }  

JSONParseDemoActivity.java

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.tianjf;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5.   
  6. public class JSONParseDemoActivity extends Activity {  
  7.   
  8.     private static final String JSONString = "[{\"name\":\"Michael\",\"age\":20},{\"name\":\"Mike\",\"age\":21}]";  
  9.   
  10.     @Override  
  11.     public void onCreate(Bundle savedInstanceState) {  
  12.         super.onCreate(savedInstanceState);  
  13.         setContentView(R.layout.main);  
  14.   
  15.         JSONUtils jsonUtils = new JSONUtils();  
  16.         jsonUtils.parseJson(JSONString);  
  17.     }  
  18. }  

这个例子是解析[{"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

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.tianjf;  
  2.   
  3. public class User {  
  4.     private String name ;  
  5.     private int age ;  
  6.     public String getName() {  
  7.         return name;  
  8.     }  
  9.     public void setName(String name) {  
  10.         this.name = name;  
  11.     }  
  12.     public int getAge() {  
  13.         return age;  
  14.     }  
  15.     public void setAge(int age) {  
  16.         this.age = age;  
  17.     }  
  18. }  

JSONUtils.java

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.tianjf;  
  2.   
  3. import com.google.gson.Gson;  
  4.   
  5. public class JSONUtils {  
  6.     public void parseUserFromJson(String jsonData) {  
  7.         Gson gson = new Gson();  
  8.         // Gson的fromJson方法是一 一对应的关系,自动将JSON的数据匹配到User对象中  
  9.         User user = gson.fromJson(jsonData, User.class);  
  10.         System.out.println("name--->" + user.getName());  
  11.         System.out.println("age---->" + user.getAge());  
  12.     }  
  13. }  

JSONParseDemoActivity.java

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.tianjf;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5.   
  6. public class JSONParseDemoActivity extends Activity {  
  7.   
  8.     private static final String JSONString = "{\"name\":\"Michael\",\"age\":20}";  
  9.   
  10.     @Override  
  11.     public void onCreate(Bundle savedInstanceState) {  
  12.         super.onCreate(savedInstanceState);  
  13.         setContentView(R.layout.main);  
  14.   
  15.         JSONUtils jsonUtils = new JSONUtils();  
  16.         jsonUtils.parseUserFromJson(JSONString);  
  17.     }  
  18. }  

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

User.java

同上


JSONUtils.java

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.tianjf;  
  2.   
  3. import java.lang.reflect.Type;  
  4. import java.util.Iterator;  
  5. import java.util.LinkedList;  
  6.   
  7. import com.google.gson.Gson;  
  8. import com.google.gson.reflect.TypeToken;  
  9.   
  10. public class JSONUtils {  
  11.     public void parseUserFromJson(String jsonData) {  
  12.         Type listType = new TypeToken<LinkedList<User>>() {}.getType();  
  13.         Gson gson = new Gson();  
  14.         LinkedList<User> users = gson.fromJson(jsonData, listType);  
  15.         Iterator<User> iterator = users.iterator();  
  16.         while (iterator.hasNext()) {  
  17.             User user = (User) iterator.next();  
  18.             System.out.println("name--->" + user.getName());  
  19.             System.out.println("age---->" + user.getAge());  
  20.         }  
  21.     }  
  22. }  

JSONParseDemoActivity.java

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.tianjf;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5.   
  6. public class JSONParseDemoActivity extends Activity {  
  7.   
  8.     private static final String JSONString = "[{\"name\":\"Michael\",\"age\":20},{\"name\":\"Mike\",\"age\":21}]";  
  9.   
  10.     @Override  
  11.     public void onCreate(Bundle savedInstanceState) {  
  12.         super.onCreate(savedInstanceState);  
  13.         setContentView(R.layout.main);  
  14.   
  15.         JSONUtils jsonUtils = new JSONUtils();  
  16.         jsonUtils.parseUserFromJson(JSONString);  
  17.     }  
  18. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值