zoukankan      html  css  js  c++  java
  • 【Android网络开发の4】解析和生成JSON数据

     【Android网络开发の4】解析和生成JSON数据
    2013-02-25 00:46:31
    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://gejw0623.blog.51cto.com/4532274/1139437
    什么是json?一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。
    前面几章讲到了xml的解析和生成,本章讲解下json的解析和生成
     
    首先我们看下json和xml的异同处
    1.JSON和XML的数据可读性基本相同
    2.JSON和XML同样拥有丰富的解析手段
    3.JSON相对于XML来讲,数据的体积小
    4.JSON与JavaScript的交互更加方便
    5.JSON对数据的描述性比XML较差
    6.JSON的速度要远远快于XML
    JSON解析类可以分为以下几个类
     
        JSONObject:可以看作是一个json对象,这是系统中有关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 。
     
        JSONStringer:json文本构建类 ,根据官方的解释,这个类可以帮助快速和便捷的创建JSON text。其最大的优点在于可以减少由于 格式的错误导致程序异常,引用这个类可以自动严格按照JSON语法规则(syntax rules)创建JSON text。每个 JSONStringer实体只能对应创建一个JSON text。。其最大的优点在于可以减少由于格式的错误导致程序异常,引用这个类可以自动严格按照JSON语法规则(syntax rules)创建JSON text。每个JSONStringer实体只能对应创建一个JSON text。
     
        JSONArray:它代表一组有序的数值。将其转换为String输出(toString)所表现的形式是用方括号包裹,数值以逗号”,”分隔(例如:     [value1,value2,value3],大家可以亲自利用简短的代码更加直观的了解其格式)。这个类的内部同样具有查询行为,     get()和opt()两种方法都可以通过index索引返回指定的数值,put()方法用来添加或者替换数值。同样这个类的value类型可以包括:Boolean、JSONArray、JSONObject、Number、String或者默认值JSONObject.NULL object。
     
        JSONTokener:json解析类 
        JSONException:json中用到的异常 

    一、构建json
    首先  我们来构建一个下面的简单的json
    1. /** 
    2.      * 生成json 
    3.      * */ 
    4.     public String createJson() { 
    5.         // TODO Auto-generated method stub 
    6.  
    7.         try { 
    8.             JSONObject jsonObject = new JSONObject(); 
    9.             jsonObject.put("id""1"); 
    10.             jsonObject.put("name""李磊"); 
    11.             jsonObject.put("age""30"); 
    12.             return jsonObject.toString(); 
    13.         } catch (Exception e) { 
    14.             // TODO Auto-generated catch block 
    15.             e.printStackTrace(); 
    16.         } 
    17.         return ""
    18.     } 
    得到的json数据为:{"id":"1","name":"李磊","age":"30"}
    这应该算是最简单的一个json数据
    实现的流程就是新建一个jsonobject对象,通过put将属性添加到json
     
    接下来 我们来创建一个带有数组的json数据
    1. /** 
    2.  * 生成json 
    3.  * */ 
    4. public String createJson() { 
    5.     // TODO Auto-generated method stub 
    6.  
    7.     List<Person> persons = getTestValues(); 
    8.     try { 
    9.         JSONObject jsonObject = new JSONObject();
    10.  
    11.         JSONArray array = new JSONArray(); 
    12.         for (int i = 0; i < persons.size(); i++) { 
    13.             JSONObject person = new JSONObject(); 
    14.             Person p = persons.get(i); 
    15.             person.put("id", p.getId()); 
    16.             person.put("name", p.getName()); 
    17.             person.put("age", p.getAge()); 
    18.             array.put(person); 
    19.         } 
    20.         jsonObject.put("persons", array); 
    21.         System.out.println(jsonObject.toString()); 
    22.         return jsonObject.toString(); 
    23.     } catch (Exception e) { 
    24.         // TODO Auto-generated catch block 
    25.         e.printStackTrace(); 
    26.     } 
    27.     return ""
    上面的代码  我们得到的是这样的数据
    {"persons":[{"id":"1","age":"30","name":"李磊"},{"id":"2","age":"25","name":"韩梅梅"}]}
    看了代码之后就会发现  代码很容易理解

    1.创建最外层的{}对象jsonObject

    2.创建数组对象 用来保存两个人的信息

    3.在循环内创建jsonObject对象 用来保存每个人的信息,别忘了添加完属性之后 将对象添加到数组

    4.将数组添加到最外层对象

     
    我们除了使用jsonObject和jsonArray来创建json之外 我们还可以使用JSONStringer
    1. /** 
    2.  * 生成json 
    3.  * */ 
    4. public String createJson() { 
    5.     // TODO Auto-generated method stub 
    6.  
    7.     JSONStringer jsonStringer = new JSONStringer(); 
    8.     try { 
    9.         jsonStringer.object(); 
    10.         jsonStringer.key("id").value("1"); 
    11.         jsonStringer.key("name").value("李磊"); 
    12.         jsonStringer.key("age").value("30"); 
    13.         jsonStringer.endObject(); 
    14.          
    15.         System.out.println(jsonStringer.toString()); 
    16.     } catch (Exception e) { 
    17.         // TODO Auto-generated catch block 
    18.         e.printStackTrace(); 
    19.     } 
    20.      
    21.     return jsonStringer.toString(); 
    上面的代码   我们得到了这样的数据{"id":"1","name":"李磊","age":"30"}
    和第一次获取的一块 接下来  我们讲下大概

    1. 首先 新建JSONStringer对象

    2. 调用object()方法 说明开始创建 添加了头{(当然,要和endobject成对出现)

    3. 添加一个属性 通过key("name") 添加了属性了名称  通过value("value") 添加了属性的值

    4. 添加完所有内容之后,调用endobject()方法通知json创建完毕

    好了  接下来我们使用JSONStringer创建一个带有数组的json数据
    1. /** 
    2.  * 生成json 
    3.  * */ 
    4. public String createJson() { 
    5.     // TODO Auto-generated method stub 
    6.  
    7.     List<Person> persons = getTestValues(); 
    8.     JSONStringer jsonStringer = new JSONStringer(); 
    9.     try { 
    10.         jsonStringer.object(); 
    11.         jsonStringer.key("persons"); 
    12.         jsonStringer.array(); 
    13.          
    14.         for (int i = 0; i < persons.size(); i++) { 
    15.             Person person = persons.get(i); 
    16.              
    17.             jsonStringer.object(); 
    18.             jsonStringer.key("id").value(person.getId()); 
    19.             jsonStringer.key("name").value(person.getName()); 
    20.             jsonStringer.key("age").value(person.getAge()); 
    21.             jsonStringer.endObject(); 
    22.         } 
    23.         jsonStringer.endArray(); 
    24.          
    25.         jsonStringer.endObject(); 
    26.          
    27.         System.out.println(jsonStringer.toString()); 
    28.     } catch (Exception e) { 
    29.         // TODO Auto-generated catch block 
    30.         e.printStackTrace(); 
    31.     } 
    32.      
    33.     return jsonStringer.toString(); 
    看下生成的字符串
    {"persons":[{"id":"1","name":"李磊","age":"30"},{"id":"2","name":"韩梅梅","age":"25"}]}
    是我们需要的数据

    1.创建一个新的JSONStringer对象 用来存储生成的json数据

    2.首先调用key("persons") 添加数组的key值

    3.调用array()通知系统 接下来的是一个数组 (和endarray()一起出现)

    4.在循环内部通过object()方法  创建一对{} 然后将属性添加到大括号内

    上面的代码我们讲了怎么去生成json数据

    二、解析JSON
    接下来我们来解析一个最简单的json数据 数据为{"id":"1","name":"李磊","age":"30"}
    我们来看下解析的代码
    1. /** 
    2.      * 解析json 
    3.      * */ 
    4.     public Person parserJson() { 
    5.         // TODO Auto-generated method stub 
    6.  
    7.         String json = "{"id":"1","name":"李磊","age":"30"}"
    8.  
    9.         Person person = new Person(); 
    10.         try { 
    11.             JSONTokener jsonTokener = new JSONTokener(json); 
    12.              // 此时还未读取任何json文本,直接读取就是一个JSONObject对象。   
    13.             // 如果此时的读取位置在"name" : 了,那么nextValue就是"李磊"(String)   
    14.             JSONObject jsonObject = (JSONObject) jsonTokener.nextValue(); 
    15.             person.setId(jsonObject.getString("id")); 
    16.             person.setName(jsonObject.getString("name")); 
    17.             person.setAge(jsonObject.getString("age")); 
    18.  
    19.         } catch (Exception e) { 
    20.             // TODO Auto-generated catch block 
    21.             e.printStackTrace(); 
    22.         } 
    23.         return person; 
    24.     } 
    我们解析的步骤

    1.将json字符串转换为jsonTokener对象

    2.调用jsonTokener的nextValue()方法  将json数据转换为jsonObject对象

    3.通过getString(keyname)获取需要的值

    当然 nextValue()获取的不一定是jsonObject对象,详细解释看代码注释
     
    接下来  我们要来解析这样的数据,带有数组哦~
    {"persons":[{"id":"1","name":"李磊","age":"30"},{"id":"2","name":"韩梅梅","age":"25"}]}
    不难  上代码
    1. public List<Person> parserJson() { 
    2.         // TODO Auto-generated method stub 
    3.  
    4.         String json = "{"persons":[{"id":"1","name":"李磊","age":"30"},{"id":"2","name":"韩梅梅","age":"25"}]}"
    5.  
    6.         List<Person> persons = new ArrayList<Person>(); 
    7.         try { 
    8.             JSONTokener jsonTokener = new JSONTokener(json); 
    9.             // 此时还未读取任何json文本,直接读取就是一个JSONObject对象。 
    10.             // 如果此时的读取位置在"name" : 了,那么nextValue就是"李磊"(String) 
    11.             JSONObject jsonObject = (JSONObject) jsonTokener.nextValue(); 
    12.             JSONArray array = jsonObject.getJSONArray("persons"); 
    13.             for (int i = 0; i < array.length(); i++) { 
    14.                 JSONObject object = array.getJSONObject(i); 
    15.                 Person person = new Person(); 
    16.                 person.setId(object.getString("id")); 
    17.                 person.setName(object.getString("name")); 
    18.                 person.setAge(object.getString("age")); 
    19.                 persons.add(person); 
    20.             } 
    21.  
    22.         } catch (Exception e) { 
    23.             // TODO Auto-generated catch block 
    24.             e.printStackTrace(); 
    25.         } 
    26.         return persons; 
    27.     } 
     同样的  我们来解释下代码

    1.创建一个list 用来存储解析的信息

    2.将json字符串转换为jsonTokener对象,再转换为jsonObject对象

    3.通过getJSONArray("persons")获取json数组

    4.通过循环来解析json数组,解析的内容不解释,上面已经说过

     
    本章内容讲解结束  
     

    本文出自 “Panda | Android” 博客,请务必保留此出处http://gejw0623.blog.51cto.com/4532274/1139437

  • 相关阅读:
    摄像头标定GML Camera Calibration
    joda.money.Money
    aop the less note 1
    good notes
    yingyu biji 1
    flowable note1
    activiti note1
    CET4/6
    Web应用界面好帮手!DevExtreme React和Vue组件全新功能上线
    Web UI开发推荐!Kendo UI for jQuery自定义小部件——处理事件
  • 原文地址:https://www.cnblogs.com/li-print/p/3377816.html
Copyright © 2011-2022 走看看