Android 基础总结:( 二十二)JSON详解(上)

来源:互联网 发布:服务器端软件 编辑:程序博客网 时间:2024/06/13 10:32

Android Json 基础

1、JSON(JavaScript Object Notation) 定义:

一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案(有点类似于正则表达式,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换。JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为。 – Json.org

2、JSON的结构:

(1) Name/Value Pairs(无序的):类似所熟知的Keyed list、 Hash table、Disctionary和Associative array。在Android平台中同时存在另外一个类"Bundle",某种程度上具有相似的行为。

(2) Array(有序的):一组有序的数据列表。

对象

对象是一个无序的Name/Value Pairs集合。{ name:value, name:value, name:value .... }

例子:{ "name":"小猪","age":20 }

Array

Array是值(value)的有序集合。[ value , value , value ...... ] 值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套。

字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。 例如:\ + " \ / b f n r t u 进行转义。

例子1: Array里面包含对象(object)

[ {"id":1,"name":"小猪" ,"age”:22} , {"id":2,"name":"小猫","age”:23} , .......]

例子2:同样对象(object)中可以包含Array

(1)一个对象包含1个数组,2个子对象

[java] view plain copy
 print?
  1. {"root":[{"id":"001","name":"С??"},{"id":"002","name":"Сè"},{"id":"003","name":"С??"}],  
  2. "total":3,  
  3. "success":true  
  4. }  
(2)也可以对象嵌套子对象,子对象再嵌套数组
[java] view plain copy
 print?
  1. {"calendar":   
  2.     {"calendarlist":  
  3.             [  
  4.             {"id":"001","name":"С??"},  
  5.             {"id":"002","name":"Сè"}  
  6.             ]  
  7.     }   
  8. }  

总之,格式多种多样,可以互相嵌套。

在Android中包含四个与JSON相关的类和一个Exceptions:

JSONArray

JSONObject

JSONStringer

JSONTokener

JSONException

(1)JSONObject:

这是系统中有关JSON定义的基本单元,其包含一对儿(Key/Value)数值。

它对外部(External:应用toString()方法输出的数值)调用的响应体现为一个标准的字符串(例如:{“JSON”:“Hello,World”},最外被大括号包裹,其中的Key和Value被冒号”:”分隔)。其对于内部(Internal)行为的操作格式略微,例如:初始化一个JSONObject实例,引用内部的put()方法添加数值:new JSONObject().put(“JSON”, “Hello, World!”),在Key和Value之间是以逗号”,”分隔。

Value的类型包括:Boolean、JSONArray、JSONObject、Number、String或者默认值JSONObject.NULL object。

有两个不同的取值方法:

get(): 在确定数值存在的条件下使用,否则当无法检索到相关Key时,将会抛出一个Exception信息。

opt(): 这个方法相对比较灵活,当无法获取所指定数值时,将会返回一个默认数值,并不会抛出异常。

(2)JSONArray:

它代表一组有序的数值。将其转换为String输出(toString)所表现的形式是用方括号包裹,数值以逗号”,”分隔(例如:[value1,value2,value3],大家可以亲自利用简短的代码更加直观的了解其格式)。这个类的内部同样具有查询行为,get()和opt()两种方法都可以通过index索引返回指定的数值,put()方法用来添加或者替换数值。

同样这个类的value类型可以包括:Boolean、JSONArray、JSONObject、Number、String或者默认值JSONObject.NULL object。

(3)JSONStringer:

根据官方的解释,这个类可以帮助快速和便捷的创建JSONtext。其最大的优点在于可以减少由于格式的错误导致程序异常,引用这个类可以自动严格按照JSON语法规则(syntaxrules)创建JSON text。每个JSONStringer实体只能对应创建一个JSON text。

根据下边的实例来了解其它相关信息:

[java] view plain copy
 print?
  1. String myString = new JSONStringer().object().key("name").value("小猪").endObject().toString();  

结果是一组标准格式的JSON text:{"name" : "小猪"}

其中的.object()和.endObject()必须同时使用,是为了按照Object标准给数值添加边界。同样,针对数组也有一组标准的方法来生成边界.array()和.endArray()。

(4)JSONTokener:

这个是系统为JSONObject和JSONArray构造器解析JSON source string的类,它可以从source string中提取数值信息。

JSONException:是JSON.org类抛出的异常信息。

下面引用一个完整的应用实例:

应用JSONObject存储Map类型数值:

[java] view plain copy
 print?
  1. public static JSONObject getJSON(Map map) {  
  2.     Iterator iter = map.entrySet().iterator();  
  3.     JSONObject holder = new JSONObject();  
  4.     while (iter.hasNext()) {  
  5.         Map.Entry pairs = (Map.Entry) iter.next();  
  6.         String key = (String) pairs.getKey();  
  7.         Map m = (Map) pairs.getValue();  
  8.         JSONObject data = new JSONObject();  
  9.         try {  
  10.             Iterator iter2 = m.entrySet().iterator();  
  11.             while (iter2.hasNext()) {  
  12.                 Map.Entry pairs2 = (Map.Entry) iter2.next();  
  13.                 data.put((String) pairs2.getKey(),  
  14.                         (String) pairs2.getValue());  
  15.             }  
  16.             holder.put(key, data);  
  17.         } catch (JSONException e) {  
  18.             Log.e("Transforming""There was an error packaging JSON", e);  
  19.         }  
  20.     }  
  21.     return holder;  
  22. }  
  23. public static JSONObject getJSON(Map map) {  
  24.     Iterator iter = map.entrySet().iterator();  
  25.     JSONObject holder = new JSONObject();  
  26.     while (iter.hasNext()) {  
  27.         Map.Entry pairs = (Map.Entry) iter.next();  
  28.         String key = (String) pairs.getKey();  
  29.         Map m = (Map) pairs.getValue();  
  30.         JSONObject data = new JSONObject();  
  31.         try {  
  32.             Iterator iter2 = m.entrySet().iterator();  
  33.             while (iter2.hasNext()) {  
  34.                 Map.Entry pairs2 = (Map.Entry) iter2.next();  
  35.                 data.put((String) pairs2.getKey(),  
  36.                         (String) pairs2.getValue());  
  37.             }  
  38.             holder.put(key, data);  
  39.         } catch (JSONException e) {  
  40.             Log.e("Transforming""There was an error packaging JSON", e);  
  41.         }  
  42.     }  
  43.     return holder;  
  44. }  

Json写入类-JsonWriter

在Android中新增了一个JSON写入类android.util.JsonWriter,使用JsonWriter可以轻松的生成JSON格式的数据,比如下面的JSON数据为:

[java] view plain copy
 print?
  1. {  
  2.   "id"912345678901,  
  3.   "text""How do I write JSON on Android?",  
  4.   "geo"null,  
  5.   "user": {  
  6.       "name""android_newb",  
  7.       "followers_count"41  
  8.   },  
  9.   {  
  10.       "id"912345678902,  
  11.       "text""@android_newb just use android.util.JsonWriter!",  
  12.       "geo": [50.454722, -104.606667],  
  13.       "user": {  
  14.           "name""jesse",  
  15.           "followers_count"2  
  16.       }  
  17.   }  
  18. }  
上面的JSON数据在Android honeycomb上的写入代码为

[java] view plain copy
 print?
  1. public void writeJsonStream(OutputStream out, List messages)  
  2.         throws IOException {  
  3.     JsonWriter writer = new JsonWriter(new OutputStreamWriter(out, "UTF-8"));  
  4.     // Android开发网提示这是UTF-8编码  
  5.     writer.setIndent(" ");  
  6.     writeMessagesArray(writer, messages);  
  7.     writer.close();  
  8. }  
  9. public void writeMessagesArray(JsonWriter writer, List messages)  
  10.         throws IOException {  
  11.     writer.beginArray();  
  12.     for (Message message : messages) {  
  13.         writeMessage(writer, message);  
  14.     }  
  15.     writer.endArray();  
  16. }  
  17. public void writeMessage(JsonWriter writer, Message message)  
  18.         throws IOException {  
  19.     writer.beginObject();  
  20.     writer.name("id").value(message.getId());  
  21.     writer.name("text").value(message.getText());  
  22.     if (message.getGeo() != null) {  
  23.         writer.name("geo");  
  24.         writeDoublesArray(writer, message.getGeo());  
  25.     } else {  
  26.         writer.name("geo").nullValue();  
  27.     }  
  28.     writer.name("user");  
  29.     writeUser(writer, message.getUser());  
  30.     writer.endObject();  
  31. }  
  32. {  
  33.     writer.beginObject();  
  34.     writer.name("name").value(user.getName());  
  35.     writer.name("followers_count").value(user.getFollowersCount());  
  36.     writer.endObject();  
  37. }  
  38. public void writeDoublesArray(JsonWriter writer, List doubles)  
  39.         throws IOException {  
  40.     writer.beginArray();  
  41.     for (Double value : doubles) {  
  42.         writer.value(value);  
  43.     }  
  44.     writer.endArray();  
  45. }  
0 0
原创粉丝点击