前面我们学习过了一种简单的数据存储语言XML,以其自身的优点在业界得到广泛的支持。今天,我们来看看另一种轻量级的数据存储格式--JSON

   一:JSON到底是什么?

   个人认为,JSON其实就是一个有着格式标准的字符串序列,可以按照某些标准将数据存储成JSON的形式,而我们也可以从这个字符串序中提取出我们所需的数据。JSON解析正是将字符串变为我们需要的数据的过程。

   二:JSON的组成

   JSON中有一种结构叫做对象,他是被{   }包括起来的内容,数据结构为{key:value,key:value,....}的键值对结构。在面向对象的编程语言中,key为对象的属性,value为对象对应属性的值。别看他的数据结构这么简单,但是他却可以表示很复杂的数据。

   三:具体形式

   对象是一个无序的“名称/值”对集合。

   (1):每一个对象以“{”左括号开始,“}”右括号结尾

   (2):每一个“名称”和“值”之间用“:”分割开来

   (3):“名称/值”对之间用“,”分割

205134320.png

   例子:表示人得一个对象,可以表示为:

{"姓名":"张三","年龄":"20"}

   四:与XML的对比

   (1):可读性

   JSON和XML的可读性相对比,可能JSON略显不足,文件对于“人”来说看起来可能不是很清晰,但是机器却看得明白;XML语言对于人和机器来说都足够清晰

   (2):可扩展性

   没有什么是XML能扩展二而JSON扩展不了的

   五:实例对比

   编写一个简易的XML数据存储和JSON数据存储,从而更直观的看出二者的区别:

   1:XML形式

<?xml version="1.0" encoding="gbk" ?>
<person>
    <name>张飞</name>
    <age>20</age>
    <address>
        <city>哈尔滨</city>
        <street>和兴路</street>
    </address>
</person>

   2:JSON形式

{
    "name":"张飞",
    "age":20,
    "address":{"city":"哈尔滨","street":"和兴路"}
}

   注:对于address属性来说,他自己本身也是一个JSON对象,因为他也有自身的属性及属性值,所以也应该用“{名称/值}”括起来。

   六:JSON解析

  1:第三方jar包

   ◆进行解析之前,我们应该导入第三方jar包,为我们解析提供方便。具体的jar包请见附件内容。

   ◆具体安装:找到jar包之后,下到自己电脑的某一个位置,然后项目-->右键-->属性-->java build path -->add external jars-->选中刚才的jar包-->ok-->ok至此项目配置完毕。

  2:JSONObject

   是一个final类,继承自Object类,实现了JSON接口。构造方法用于创建对应的JSON对象,具体如下:

   ◆JSONObject():创建一个空的JSONObject对象

   ◆JSONObject(String str):通过str字符串创建JSON对象

   3:常用方法

   (1):put("名称","值"):对象方法,用于添加相应的键值对到JSON对象中

   (2):getJSONObject(String key):对象方法,根据参数中的键,找到对应的JSONObject对象

   (3):getString(String key)/getInt(String key)等:根据对应的键找到对应的值

   4:具体解析过程

   (1)JSON格式字符串的生成

   因为JSON实质就是规定格式的字符串,所以方法的返回类型为String。首先创建JSON对象,添加相应的键值对到对象中,返回JSON对象的字符串表现形式。具体如下:

// json格式的字符串的生成  --
public static String getJson() throws Exception{
    String strName = "张飞";
    int niAge = 20;
                                                                                                                                                                                
    JSONObject json = new JSONObject();//创建空JSON对象
    json.put("name", strName);//添加键值对到对象上
    json.put("age", niAge);
                                                                                                                                                                                
    JSONObject js = new JSONObject();//address也是一个JSON对象,具有两个属性
    js.put("city", "哈尔滨");//添加键值对到对象上
    js.put("street", "和兴路");
                                                                                                                                                                                
    json.put("address", js);//把 address JSON对象添加到主JSON  json  上
    // json格式的字符串     
    return json.toString();
}

   (2)JSON解析

   根据方法的传递参数,创建指定的JSON对象,从最外层的JSON对象开始,逐层根据键,查找值,做成字符串拼接,得到输出的数据

//JSON解析
    public static void parseJson(String strJson) throws Exception{
        JSONObject json = new JSONObject(strJson);//创建指定的JSON对象
        String strName = json.getString("name");//最外层的JSON对象其中的一个键,得到value
        int niAge = json.getInt("age");//最外层的JSON对象另外一个键,得到value
        JSONObject js = json.getJSONObject("address");//第二层JSON对象,根据第一层得到
        String strCity = js.getString("city");//第二层的JSON对象的一个键,得到value
        String strStreet = js.getString("street");//第二层的JSON对象另外一个键,得到value
        System.out.println("姓名:"+strName+",年龄:"+niAge+",城市:"+strCity+",街道:"+strStreet);
    }

   (3)测试:上面的两个方法,做成静态内部类的形式

public static void main(String[] args) throws Exception {
        String strJson = getJson();// json格式的字符串的生成
        parseJson(strJson);//JSON解析
    }

   (4)结果:

JSON格式字符串:{"age":20,"address":{"street":"和兴路","city":"哈尔滨"},"name":"张飞"}
JSON解析之后:姓名:张飞,年龄:20,城市:哈尔滨,街道:和兴路


   JSON经常用于Android中,比如根据中国气象对外接口,访问到的就是JSON格式的字符串,通过解析,得到我们需要的天气信息,添加到软件设计中,作为提供天气变化的途径,大家可自行试一试解析“中国气象对外接口”中的JSON对象,得到自己想要的数据,做一个类似于墨迹天气的软件。


   博主最近要回家一段时间,由于网络的不便利,可能无法定期与大家见面了。最近,有一个人这样说过:当你习惯写博客的时候,你就会觉得不写都睡不着觉。一开始觉得还不太现实,但是现在的我信了,静下心来,把自己学到的知识写出来,与大家分享的感觉真好。这几天的我不知道是不是又该飘起来?应该学会内心平静。。对吧。。这几天的缺席,我会以更大的努力补回来的,等我回来哦。。给自己的心情放个假,呼吸呼吸新鲜空气吧。                  j_0008.gif我还会回来的。。。