JSON

最近用到JSON,查阅整理了一下。有点长。。。不割

1.JSON介绍

        JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成。(官方网站http://www.json.org)

2.JSON语法

        JSON 语法是 JavaScript 语法的子集。

        JSON语法的规则就是:使用大括号‘ { } ‘,中括号‘ [ ] ‘,逗号‘ ‘,冒号‘ ‘,双引号‘ “ ” ‘。

        JSON 值可以是:数字(整数或浮点数)、字符串(在双引号中)、逻辑值(true 或 false)、数组(在方括号中)、对象(在花括号中)、null 。

        JSON 数据的书写格式是:名称 / 值对。

        名称/值对组合中的名称写在前面(在双引号中),值对写在后面(同样在双引号中),中间用冒号隔开:

  "firstName":"John"
        这很容易理解,等价于这条 JavaScript 语句:
  firstName="John"

3.JSON基础结构

        JSON 结构有两种结构,json简单说就是javascript中的对象和数组,所以这两种结构就是对象和数组两种结构,通过这两种结构可以表示各种复杂的结构。
        1、对象:对象在js中表示为“{}”括起来的内容,数据结构为 {key:value,key:value,...}的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为 对象.key 获取属性值,这个属性值的类型可以是 数字、字符串、数组、对象几种。
        2、数组:数组在js中是中括号“[]”括起来的内容,数据结构为 ["java","javascript","vb",...],取值方式和所有语言中一样,使用索引获取,字段值的类型可以是 数字、字符串、数组、对象几种。
        经过对象、数组2种结构就可以组合成复杂的数据结构了。

4.JSON具体形式

1、对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。

例子:表示人的一个对象:

{
"姓名":"大憨",
"年龄":24
} 

2、数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。

例子:一组学生
{ 
"学生": 
[
{"姓名":"小明","年龄":23},
{"姓名":"大憨","年龄":24}
]
} 
说明:此Json对象包括了一个学生数组,而学生数组中的值又是两个Json对象。

3、(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套。


4、字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。 字符串(string)与C或者Java的字符串非常相似。


5、数值(number)也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。


5.JSON基础示例

        简单地说,JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在函数之间轻松地传递这个字符串,或者在异步应用程序中将字符串从 Web 客户机传递给服务器端程序。这个字符串看起来有点儿古怪,但是JavaScript很容易解释它,而且 JSON 可以表示比"名称 / 值对"更复杂的结构。例如,可以表示数组和复杂的对象,而不仅仅是键和值的简单列表。

名称 / 值对

        按照最简单的形式,可以用下面这样的 JSON 表示"名称 / 值对":
{"firstName":"Brett"}
这个示例非常基本,而且实际上比等效的纯文本"名称 / 值对"占用更多的空间:
firstName=Brett
        但是,当将多个"名称 / 值对"串在一起时,JSON 就会体现出它的价值了。首先,可以创建包含多个"名称 / 值对"的 记录,比如:
{"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"}
        从语法方面来看,这与"名称 / 值对"相比并没有很大的优势,但是在这种情况下 JSON 更容易使用,而且可读性更好。例如,它明确地表示以上三个值都是同一记录的一部分;花括号使这些值有了某种联系。

表示数组

        当需要表示一组值时,JSON 不但能够提高可读性,而且可以减少复杂性。例如,假设您希望表示一个人名列表。在XML中,需要许多开始标记和结束标记;如果使用典型的名称 / 值对(就像在本系列前面文章中看到的那种名称 / 值对),那么必须建立一种专有的数据格式,或者将键名称修改为 person1-firstName这样的形式。
        如果使用 JSON,就只需将多个带花括号的记录分组在一起:
{
"people":[
{"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"},
{"firstName":"Jason","lastName":"Hunter","email":"bbbb"},
{"firstName":"Elliotte","lastName":"Harold","email":"cccc"}
]
}
        这不难理解。在这个示例中,只有一个名为 people的变量,值是包含三个条目的数组,每个条目是一个人的记录,其中包含名、姓和电子邮件地址。上面的示例演示如何用括号将记录组合成一个值。当然,可以使用相同的语法表示多个值(每个值包含多个记录):
{"programmers":[ 
{"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"},
{"firstName":"Jason","lastName":"Hunter","email":"bbbb"},
{"firstName":"Elliotte","lastName":"Harold","email":"cccc"} 
],
"authors":[
{"firstName":"Isaac","lastName":"Asimov","genre":"sciencefiction"}, 
{"firstName":"Tad","lastName":"Williams","genre":"fantasy"},
{"firstName":"Frank","lastName":"Peretti","genre":"christianfiction"} 
],
"musicians":[
{"firstName":"Eric","lastName":"Clapton","instrument":"guitar"},
{"firstName":"Sergei","lastName":"Rachmaninoff","instrument":"piano"}
]} 
        这里最值得注意的是,能够表示多个值,每个值进而包含多个值。但是还应该注意,在不同的主条目(programmers、authors 和 musicians)之间,记录中实际的名称 / 值对可以不一样。JSON 是完全动态的,允许在 JSON 结构的中间改变表示数据的方式。
在处理 JSON 格式的数据时,没有需要遵守的预定义的约束。所以,在同样的数据结构中,可以改变表示数据的方式,甚至可以以不同方式表示同一事物。

6.JSON格式应用

        掌握了 JSON 格式之后,在 JavaScript 中使用它就很简单了。JSON 是 JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON 数据不需要任何特殊的 API 或工具包。

赋值给变量

        例如,可以创建一个新的 JavaScript 变量,然后将 JSON 格式的数据字符串直接赋值给它:
var people={"programmers":[{"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"}, 
{"firstName":"Jason","lastName":"Hunter","email":"bbbb"}, 
{"firstName":"Elliotte","lastName":"Harold","email":"cccc"}
],
"authors":[ {"firstName":"Isaac","lastName":"Asimov","genre":"sciencefiction"}, 
{"firstName":"Tad","lastName":"Williams","genre":"fantasy"}, 
{"firstName":"Frank","lastName":"Peretti","genre":"christianfiction"}
],
"musicians":[ {"firstName":"Eric","lastName":"Clapton","instrument":"guitar"}, 
{"firstName":"Sergei","lastName":"Rachmaninoff","instrument":"piano"}
]} 
        这非常简单;people包含前面看到的 JSON 格式的数据。但是,这还不够,因为访问数据的方式似乎还不明显。

访问数据

        尽管看起来不明显,但是上面的长字符串实际上只是一个数组;将这个数组放进 JavaScript变量之后,就可以很轻松地访问它。实际上,只需用点号表示法来表示数组元素。所以,要想访问 programmers 列表的第一个条目的姓氏,只需在 JavaScript 中使用下面这样的代码:
people.programmers[0].lastName; 
        注意,数组索引是从零开始的。所以,这行代码首先访问 people变量中的数据;然后移动到称为 programmers的条目,再移动到第一个记录([0]);最后,访问 lastName键的值。结果是字符串值 “McLaughlin”。
下面是使用同一变量的几个示例。
people.authors[1].genre//Valueis"fantasy"
people.musicians[3].lastName//Undefined.Thisreferstothefourthentry,andthereisn'tone
people.programmers[2].firstName//Valueis"Elliotte" 
        利用这样的语法,可以处理任何 JSON 格式的数据,而不需要使用任何额外的 JavaScript 工具包或 API。

修改数据

        正如可以用点号和方括号访问数据,也可以按照同样的方式轻松地修改数据:
people.musicians[1].lastName="Rachmaninov"; 
        在将字符串转换为 JavaScript 对象之后,就可以像这样修改变量中的数据。

换回字符串

        最终结论是,如果要处理大量 JavaScript 对象,那么 JSON 是一个好选择,这样就可以轻松地将数据转换为可以在请求中发送给服务器端程序的格式。

7.实例比较

        XML和JSON都使用结构化方法来标记数据,下面来做一个简单的比较。
        用XML表示中国部分省市数据如下:

<?xmlversion="1.0"encoding="utf-8"?>
<country>
    <name>中国</name>
    <province>
        <name>黑龙江</name>
        <cities>
           <city>哈尔滨</city>
           <city>大庆</city>
        </cities>
    </province>
    <province>
        <name>广东</name>
        <cities>
           <city>广州</city>
           <city>深圳</city>
           <city>珠海</city>
        </cities>
    </province>
    <province>
        <name>台湾</name>
        <cities>
           <city>台北</city>
           <city>高雄</city>
        </cities>
    </province>
    <province>
        <name>新疆</name>
        <cities>
           <city>乌鲁木齐</city>
        </cities>
    </province>
</country>
        用JSON表示如下:
{
    "name": "中国",
    "province": [
        {
            "name": "黑龙江",
            "cities": {
                "city": ["哈尔滨","大庆"]
            }
        },
        {
            "name": "广东",
            "cities": {
                "city": ["广州","深圳","珠海"]
            }
        },
        {
            "name": "台湾",
            "cities": {
                "city": ["台北","高雄"]
            }
        },
        {
            "name": "新疆",
            "cities": {
                "city": ["乌鲁木齐"]
            }
        }
    ]
}

        编码的可读性,xml有明显的优势,毕竟人类的语言更贴近这样的说明结构。json读起来更像一个数据块,读起来就比较费解了。不过,我们读起来费解的语言,恰恰是适合机器阅读,所以通过json的索引.province[0].name就能够读取“黑龙江”这个值。

        编码的手写难度来说,xml还是舒服一些,好读当然就好写。不过写出来的字符JSON就明显少很多。去掉空白制表以及换行的话,JSON就是密密麻麻的有用数据,而xml却包含很多重复的标记字符。

         跟XML相比,JSON简洁明了,操作方便,JSON和XML都是基于文本的,两者都使用Unicode编码。JSON和XML都很容易阅读。主观上,JSON更清晰,冗余更少。XML适合标记文档(配置文件),JSON更适合数据交换。

8.JSON操作

1、JSON字符串转换成JAVAScript对象(调用eval())

JSON本来就是JS的一个子集,所以可以使用JS的解释器

<script>
  var my_json='{"FBI":[{"name":"rose","age":"25"},{"name":"jack","age":"25"}],"NBA":[{"name":"tom","sex":"man"},{"name":"jack","sex":"women"}]}';
  var my_object=eval('('+my_json+')');
  document.writeln(my_object.FBI[1].name);
</script>
上面的代码也可省略属性的双引号
 var my_json='{FBI:[{name:"rose",age:"25"},{name:"jack",age:"25"}],NBA:[{name:"tom",sex:"man"},{name:"jack",sex:"women"}]}';

2、将JS对象转换成JSON字符串(调用toJSONString())

需要下载json.js(http://www.json.org/json.js)

<script src="json.js"></script>
<script>
 var my_object={
    FBI:[
    {name:"rose",age:"25"},
    {name:"jack",age:"25"}
    ],
    NBA:[
    {name:"tom",sex:"man"},
    {name:"jack",sex:"women"}
    ]
 };
document.writeln(my_object.toJSONString());
</script>

3、XML与JSON转换

(需要下载json.org提供的JAVA类,json.zip[http://www.json.org/java/json.zip])

package away;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;

import org.json.JSONObject;
import org.json.XML;

public class XMl2JSON {


    public static void main(String[] args) {
        BufferedReader buffRed=null;
        BufferedWriter buffWri=null;
        try{
            //将XML转换成JSON
            String fileName1="away.xml";
            buffRed=new BufferedReader(new FileReader(fileName1));
            String tempStr;
            StringBuffer xmlStrBuff=new StringBuffer();
            while((tempStr=buffRed.readLine())!=null)
                xmlStrBuff.append(tempStr);
            System.out.println("JSON str="+XML.toJSONObject(xmlStrBuff.toString()));
            
            //将JSON转换成XML
            String jsonStr="{Heros:{FBI:[{name:\"rose\",age:\"25\"},{name:\"jack\",age:\"25\"}],NBA:[{name:\"tom\",sex:\"man\"},{name:\"jack\",sex:\"women\"}]}};";
            String fileName2="myxml.xml";
            buffWri=new BufferedWriter(new FileWriter(fileName2));
            JSONObject jsonObj=new JSONObject(jsonStr);
            buffWri.write("<?xml version=\"1.0\" encoding=\"GBK\"?>");
            buffWri.newLine();
            buffWri.write("<!DOCTYPE properties SYSTEM \"http://java.sun.com/dtd/properties.dtd\">");
            buffWri.newLine();
            buffWri.write(XML.toString(jsonObj));
            buffWri.flush();
            
            System.out.println("run end!");
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try{
                if(buffRed!=null)
                    buffRed.close();
                if(buffWri!=null)
                    buffWri.close();
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }
}
xml文件内容:
<?xml version="1.0" encoding="GBK"?> 
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> 
<properties> 
<entry key="no">away</entry> 
<entry key="name">HELLO_AWAY</entry> 
</properties> 

输出结果:

JSON str={"properties":{"entry":[{"key":"no","content":"away"},{"key":"name","content":"HELLO_AWAY"}]}}
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<Heros><NBA><sex>man</sex><name>tom</name></NBA><NBA><sex>women</sex><name>jack</name></NBA><FBI><age>25</age><name>rose</name></FBI><FBI><age>25</age><name>jack</name></FBI></Heros>

4、AJAX中运用JSON

(比使用DOM解析XML简单)
//在响应的程序中输入返回的值:
  out.println("{FBI:[{name:\"rose\",age:\"25\"},{name:\"jack\",age:\"25\"}],NBA:[{name:\"tom\",sex:\"man\"},{name:\"jack\",sex:\"women\"}]}");
//在页面上(点确定页面上会显示jack)
<script language="javascript" src="js/prototype.js"></script>
<input type="button" onclick="loadInfo()" value="确定"/>
<script>
function loadInfo(){
    new Ajax.Request("hello",{
            onComplete:function(req){
                var res=eval("("+req.responseText+")");
                $('mydiv').innerHTML=res.FBI[1].name;
            }
        }
    );
}
</script>
<div id="mydiv"></div>

5、Java中运用Json

(需要下载json的java开发包)
package callCenterServer;

import java.util.ArrayList;
import org.json.JSONArray;
import org.json.JSONObject;

public class Test {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception{
        ArrayList<Area> areas=new ArrayList<Area>();
        areas.add(new Test.Area("福建","福州"));
        areas.add(new Test.Area("福建","厦门"));
        areas.add(new Test.Area("福建","泉州"));
        areas.add(new Test.Area("四川","成都"));
        areas.add(new Test.Area("四川","攀枝花"));
        JSONObject jsonObject=new JSONObject();
        for(Test.Area area:areas){
            if(jsonObject.has(area.province)){
                JSONArray jsonArray=(JSONArray)jsonObject.get(area.province);
                jsonArray.put(area.city);
            }else{
                JSONArray jsonArray=new JSONArray();
                jsonArray.put(area.city);
                jsonObject.put(area.province, jsonArray);
            }
        }
        System.out.println(jsonObject);
    }
    
    static class Area{
        private final String province;
        private final String city;
        Area(String province,String city){
            this.province=province;
            this.city=city;
        }
    }
}
输出:{"四川":["成都","攀枝花"],"福建":["福州","厦门","泉州"]}

9.小结

(1)JSON的数据结构只有两种;

(2)可以嵌套表示,比如Array中可以嵌套Object等;

(3)记住:Object是以{}表示,Array是以[  ]表示;

------------------------------------整理:Away-----------------------------------------------------

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。