您的位置:首页 > Web前端 > JavaScript

Json的解析和生成

2014-02-28 14:24 375 查看
什么是json?一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。  json和xml的异同处

1.JSON和XML的数据可读性基本相同

2.JSON和XML同样拥有丰富的解析手段

3.JSON相对于XML来讲,数据的体积小

4.JSON与JavaScript的交互更加方便

5.JSON对数据的描述性比XML较差
6.JSON的速度要远远快于XML

http://blog.csdn.net/itachi85/article/details/45172205

http://blog.csdn.net/tkwxty/article/details/34474501/


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

    //生成json 

    public String createJson() { 

        try { 

            JSONObject jsonObject = new JSONObject(); 

            jsonObject.put("id", "1"); 

            jsonObject.put("name", "李磊"); 

            jsonObject.put("age", "30"); 

            return jsonObject.toString(); 

        } catch (Exception e) { 

            // TODO Auto-generated catch block 

            e.printStackTrace(); 

        } 

        return ""; 

    } 

得到的json数据为:{"id":"1","name":"李磊","age":"30"}, 这应该算是最简单的一个json数据

实现的流程就是新建一个jsonobject对象,通过put将属性添加到json

接下来 我们来创建一个带有数组的json数据   //生成json 

public String createJson() { 

    List<Person> persons = getTestValues(); 

    try { 

        JSONObject jsonObject = new JSONObject(); 

        JSONArray array = new JSONArray(); 

        for (int i = 0; i < persons.size(); i++) { 

            JSONObject person = new JSONObject(); 

            Person p = persons.get(i); 

            person.put("id", p.getId()); 

            person.put("name", p.getName()); 

            person.put("age", p.getAge()); 

            array.put(person); 

        } 

        jsonObject.put("persons", array); 

        System.out.println(jsonObject.toString()); 

        return jsonObject.toString(); 

    } catch (Exception e) { 

        e.printStackTrace(); 

    } 

    return ""; 



上面的代码  我们得到的是这样的数据

{"persons":[{"id":"1","age":"30","name":"李磊"},{"id":"2","age":"25","name":"韩梅梅"}]}

代码分析:

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

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

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

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

我们除了使用jsonObject和jsonArray来创建json之外 我们还可以使用JSONStringer

//生成json 

public String createJson() { 

    JSONStringer jsonStringer = new JSONStringer(); 

    try { 

        jsonStringer.object(); 

        jsonStringer.key("id").value("1"); 

        jsonStringer.key("name").value("李磊"); 

        jsonStringer.key("age").value("30"); 

        jsonStringer.endObject();    

        System.out.println(jsonStringer.toString()); 

    } catch (Exception e) { 

        e.printStackTrace(); 

    }      

    return jsonStringer.toString(); 



上面的代码   我们得到了这样的数据{"id":"1","name":"李磊","age":"30"}

和第一次获取的一块 接下来  我们讲下大概

1. 首先 新建JSONStringer对象

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

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

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

接下来我们使用JSONStringer创建一个带有数组的json数据

//生成json 

public String createJson() { 

    List<Person> persons = getTestValues(); 

    JSONStringer jsonStringer = new JSONStringer(); 

    try { 

        jsonStringer.object(); 

        jsonStringer.key("persons"); 

        jsonStringer.array(); 

         

        for (int i = 0; i < persons.size(); i++) { 

            Person person = persons.get(i);             

            jsonStringer.object(); 

            jsonStringer.key("id").value(person.getId()); 

            jsonStringer.key("name").value(person.getName()); 

            jsonStringer.key("age").value(person.getAge()); 

            jsonStringer.endObject(); 

        } 

        jsonStringer.endArray();          

        jsonStringer.endObject();       

        System.out.println(jsonStringer.toString()); 

    } catch (Exception e) { 

        e.printStackTrace(); 

    }    

    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"}

我们来看下解析的代码

   //解析json 

    public Person parserJson() { 

        String json = "{\"id\":\"1\",\"name\":\"李磊\",\"age\":\"30\"}"; 

        Person person = new Person(); 

        try { 

            JSONTokener jsonTokener = new JSONTokener(json); 

             // 此时还未读取任何json文本,直接读取就是一个JSONObject对象。   

            // 如果此时的读取位置在"name" : 了,那么nextValue就是"李磊"(String)   

            JSONObject jsonObject = (JSONObject) jsonTokener.nextValue(); 

            person.setId(jsonObject.getString("id")); 

            person.setName(jsonObject.getString("name")); 

            person.setAge(jsonObject.getString("age")); 

        } catch (Exception e) { 

            e.printStackTrace(); 

        } 

        return person; 

    } 

我们解析的步骤

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

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

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

当然 nextValue()获取的不一定是jsonObject对象,详细解释看代码注释

接下来 解析这样的数据,带有数组哦~

{"persons":[{"id":"1","name":"李磊","age":"30"},{"id":"2","name":"韩梅梅","age":"25"}]}

public List<Person> parserJson() { 

        String json = "{\"persons\":[{\"id\":\"1\",\"name\":\"李磊\",\"age\":\"30\"},{\"id\":\"2\",\"name\":\"韩梅梅\",\"age\":\"25\"}]}"; 

        List<Person> persons = new ArrayList<Person>(); 

        try { 

            JSONTokener jsonTokener = new JSONTokener(json); 

            // 此时还未读取任何json文本,直接读取就是一个JSONObject对象。 

            // 如果此时的读取位置在"name" : 了,那么nextValue就是"李磊"(String) 

            JSONObject jsonObject = (JSONObject) jsonTokener.nextValue(); 

            JSONArray array = jsonObject.getJSONArray("persons"); 

            for (int i = 0; i < array.length(); i++) { 

                JSONObject object = array.getJSONObject(i); 

                Person person = new Person(); 

                person.setId(object.getString("id")); 

                person.setName(object.getString("name")); 

                person.setAge(object.getString("age")); 

                persons.add(person); 

            }  

        } catch (Exception e) { 

            e.printStackTrace(); 

        } 

        return persons; 

    } 

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

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

3.通过getJSONArray("persons")获取json数组
4.通过循环来解析json数组,解析的内容不解释

gson:http://www.cnblogs.com/chenlhuaf/archive/2011/05/01/gson_test.html 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: