JSON詳解!!!


 

http://www.json.org/

JSON (JavaScript Object Notation) is a lightweight data-interchange format. It is easy for humans to read and write. It is easy for machines to parse and generate. It is based on a subset of the JavaScript Programming LanguageStandard ECMA-262 3rd Edition - December 1999. JSON is a text format that is completely language independent but uses conventions that are familiar to programmers of the C-family of languages, including C, C++, C#, Java, JavaScript, Perl, Python, and many others. These properties make JSON an ideal data-interchange language.

JSON is built on two structures:

  • A collection of name/value pairs. In various languages, this is realized as an object, record, struct, dictionary, hash table, keyed list, or associative array.
  • An ordered list of values. In most languages, this is realized as an array, vector, list, or sequence.

These are universal data structures. Virtually all modern programming languages support them in one form or another. It makes sense that a data format that is interchangeable with programming languages also be based on these structures.

In JSON, they take on these forms:

An object is an unordered set of name/value pairs. An object begins with { (left brace) and ends with } (right brace). Each name is followed by : (colon) and the name/value pairs are separated by , (comma).

An array is an ordered collection of values. An array begins with [ (left bracket) and ends with ] (right bracket). Values are separated by , (comma).

value can be a string in double quotes, or a number, or true or false or null, or an object or an array. These structures can be nested.

string is a sequence of zero or more Unicode characters, wrapped in double quotes, using backslash escapes. A character is represented as a single character string. A string is very much like a C or Java string.

number is very much like a C or Java number, except that the octal and hexadecimal formats are not used.

Whitespace can be inserted between any pair of tokens. Excepting a few encoding details, that completely describes the language.

 

 

http://www.open-open.com/lib/view/open1326376799874.html

JSON的定義:

 

       一種輕量級的數據交換格式,具有良好的可讀和便於快速編寫的特性。業內主流技術為其提供了完整的解決方案(有點類似於正則表達式 ,獲得了當今大部分語言的支持),從而可以在不同平台間進行數據交換。JSON采用兼容性很高的文本格式,同時也具備類似於C語言體系的行為。 – Json.org

JSON Vs XML

1.JSON和XML的數據可讀性基本相同

2.JSON和XML同樣擁有豐富的解析手段

3.JSON相對於XML來講,數據的體積小

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

5.JSON對數據的描述性比XML較差

 

6. JSON的速度要遠遠快於XML

 

 

android2.3提供的json解析類 

android的json解析部分都在包org.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 。

JSONStringerjson文本構建類 ,根據官方的解釋,這個類可以幫助快速和便捷的創建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中用到的異常 


JSONObject, JSONArray來構建json文本   

代碼  
  1. // 假設現在要創建這樣一個json文本  
  2. //  {  
  3. //      "phone" : ["12345678", "87654321"], // 數組  
  4. //      "name" : "yuanzhifei89", // 字符串  
  5. //      "age" : 100, // 數值  
  6. //      "address" : { "country" : "china", "province" : "jiangsu" }, // 對象  
  7. //      "married" : false // 布爾值  
  8. //  }  
  9.   
  10. try {  
  11.     // 首先最外層是{},是創建一個對象  
  12.     JSONObject person = new JSONObject();  
  13.     // 第一個鍵phone的值是數組,所以需要創建數組對象  
  14.     JSONArray phone = new JSONArray();  
  15.     phone.put("12345678").put("87654321");  
  16.     person.put("phone", phone);  
  17.   
  18.     person.put("name", "yuanzhifei89");  
  19.     person.put("age", 100);  
  20.     // 鍵address的值是對象,所以又要創建一個對象  
  21.     JSONObject address = new JSONObject();  
  22.     address.put("country", "china");  
  23.     address.put("province", "jiangsu");  
  24.     person.put("address", address);    
  25.     person.put("married", false);  
  26. catch (JSONException ex) {  
  27.     // 鍵為null或使用json不支持的數字格式(NaN, infinities)  
  28.     throw new RuntimeException(ex);  
  29. }  


getType和optType api的使用   

getType可以將要獲取的鍵的值轉換為指定的類型,如果無法轉換或沒有值則拋出JSONException 
optType也是將要獲取的鍵的值轉換為指定的類型,無法轉換或沒有值時返回用戶提供或這默認提供的值 
代碼  
  1. try {  
  2.     // 所有使用的對象都是用上面創建的對象  
  3.     // 將第一個電話號碼轉換為數值和將名字轉換為數值  
  4.     phone.getLong(0);  
  5.     person.getLong("name"); // 會拋異常,因為名字無法轉換為long        
  6.     phone.optLong(0); // 代碼內置的默認值  
  7.     phone.optLong(0, 1000); // 用戶提供的默認值  
  8.     person.optLong("name");  
  9.     person.optLong("name", 1000); // 不像上面那樣拋異常,而是返回1000  
  10. catch (JSONException ex) {  
  11.     // 異常處理代碼  
  12. }  


除了上面的兩個類,還可以使用JSONStringer來構建json文本   

Java代碼  
  1. try {  
  2.     JSONStringer jsonText = new JSONStringer();  
  3.     // 首先是{,對象開始。object和endObject必須配對使用  
  4.     jsonText.object();  
  5.       
  6.     jsonText.key("phone");  
  7.     // 鍵phone的值是數組。array和endArray必須配對使用  
  8.     jsonText.array();  
  9.     jsonText.value("12345678").value("87654321");  
  10.     jsonText.endArray();  
  11.       
  12.     jsonText.key("name");  
  13.     jsonText.value("yuanzhifei89");  
  14.     jsonText.key("age");  
  15.     jsonText.value(100);  
  16.       
  17.     jsonText.key("address");  
  18.     // 鍵address的值是對象  
  19.     jsonText.object();  
  20.     jsonText.key("country");  
  21.     jsonText.value("china");  
  22.     jsonText.key("province");  
  23.     jsonText.value("jiangsu");  
  24.     jsonText.endObject();  
  25.       
  26.     jsonText.key("married");  
  27.     jsonText.value(false);  
  28.       
  29.     // },對象結束  
  30.     jsonText.endObject();  
  31. catch (JSONException ex) {  
  32.     throw new RuntimeException(ex);  
  33. }  


json文本解析類JSONTokener   
按照RFC4627規范將json文本解析為相應的對象。  

對於將json文本解析為對象,只需要用到該類的兩個api:   
構造函數  
public Object nextValue();  

代碼  
  1. //  {  
  2. //      "phone" : ["12345678", "87654321"], // 數組  
  3. //      "name" : "yuanzhifei89", // 字符串  
  4. //      "age" : 100, // 數值  
  5. //      "address" : { "country" : "china", "province" : "jiangsu" }, // 對象  
  6. //      "married" : false // 布爾值  
  7. //  }  
  8.   
  9. private static final String JSON =   
  10. "{" +  
  11.     "   \"phone\" : [\"12345678\", \"87654321\"]," +  
  12.     "   \"name\" : \"yuanzhifei89\"," +  
  13.     "   \"age\" : 100," +  
  14.     "   \"address\" : { \"country\" : \"china\", \"province\" : \"jiangsu\" }," +  
  15.     "   \"married\" : false," +  
  16. "}";  
  17.   
  18. try {  
  19.     JSONTokener jsonParser = new JSONTokener(JSON);  
  20.     // 此時還未讀取任何json文本,直接讀取就是一個JSONObject對象。  
  21.     // 如果此時的讀取位置在"name" : 了,那么nextValue就是"yuanzhifei89"(String)  
  22.     JSONObject person = (JSONObject) jsonParser.nextValue();  
  23.     // 接下來的就是JSON對象的操作了  
  24.     person.getJSONArray("phone");  
  25.     person.getString("name");  
  26.     person.getInt("age");  
  27.     person.getJSONObject("address");  
  28.     person.getBoolean("married");  
  29. catch (JSONException ex) {  
  30.     // 異常處理代碼  
  31. }  

 

其它的api基本就是用來查看json文本中的文本的 

代碼  
  1. try {  
  2.     JSONTokener jsonParser = new JSONTokener(JSON);  
  3.     // 繼續向下讀8個json文本中的字符。此時剛開始,即在{處  
  4.     jsonParser.next(8); //{    "phone。tab算一個字符  
  5.       
  6.     // 繼續向下讀1個json文本中的字符  
  7.     jsonParser.next(); //"  
  8.       
  9.     // 繼續向下讀取一個json文本中的字符。該字符不是空白、同時也不是注視中的字符  
  10.     jsonParser.nextClean(); //:  
  11.       
  12.     // 返回當前的讀取位置到第一次遇到'a'之間的字符串(不包括a)。  
  13.     jsonParser.nextString('a'); //  ["12345678", "87654321"],    "n(前面有兩個空格)  
  14.       
  15.     // 返回當前讀取位置到第一次遇到字符串中(如"0089")任意字符之間的字符串,同時該字符是trimmed的。(此處就是第一次遇到了89)  
  16.     jsonParser.nextTo("0089"); //me" : "yuanzhifei  
  17.       
  18.     // 讀取位置撤銷一個  
  19.     jsonParser.back();  
  20.     jsonParser.next(); //i  
  21.       
  22.     // 讀取位置前進到指定字符串處(包括字符串)  
  23.     jsonParser.skipPast("address");  
  24.     jsonParser.next(8); //" : { "c  
  25.       
  26.     // 讀取位置前進到執行字符處(不包括字符)  
  27.     jsonParser.skipTo('m');  
  28.     jsonParser.next(8); //married"  
  29. catch (JSONException ex) {  
  30.     // 異常處理代碼  
  31. }  

      以下是一個標准的JSON請求實現過程:

 

HttpPost request = new HttpPost(url);  
// 先封裝一個 JSON 對象  
JSONObject param = new JSONObject();  
param.put("name", "rarnu");  
param.put("password", "123456");  
// 綁定到請求 Entry  
StringEntity se = new StringEntity(param.toString());   
request.setEntity(se);  
// 發送請求  
HttpResponse httpResponse = new DefaultHttpClient().execute(request);  
// 得到應答的字符串,這也是一個 JSON 格式保存的數據  
String retSrc = EntityUtils.toString(httpResponse.getEntity());  
// 生成 JSON 對象  
JSONObject result = new JSONObject( retSrc);  
String token = result.get("token"); 


        下面這個是自己修改別人的小例子,主要是加一些注釋和講解,這個例子主要是使用android進行json解析。 

單數據{'singer':{'id':01,'name':'tom','gender':'男'}} 
多個數據{"singers":[ 
        {'id':02,'name':'tom','gender':'男'}, 
         {'id':03,'name':'jerry,'gender':'男'}, 
{'id':04,'name':'jim,'gender':'男'}, 
{'id':05,'name':'lily,'gender':'女'}]}                                                                            

        下面的類主要是解析單個數據parseJson()和多個數據的方法parseJsonMulti(): 

publicCLASS JsonActivity extends Activity { 
	/** Called when the activity is first created. */ 
	private TextView tvJson; 
	private Button btnJson; 
	private Button btnJsonMulti; 
	@Override 
	public void onCreate(Bundle savedInstanceState) { 
		super.onCreate(savedInstanceState); 
		setContentView(R.layout.main); 
		tvJson = (TextView) this.findViewById(R.id.tvJson); 
		btnJson = (Button) this.findViewById(R.id.btnJson); 
		btnJsonMulti = (Button) this.findViewById(R.id.btnJsonMulti); 
		btnJson.setOnClickListener(new View.OnClickListener() { 
			@Override 
			public void onClick(View v) { 
				// url 
				// String strUrl = "http://10.158.166.110:8080/AndroidServer/JsonServlet"; 
				String strUrl = ServerPageUtil.getStrUrl(UrlsOfServer.JSON_SINGER); 
				//獲得返回的Json字符串 
				String strResult = connServerForResult(strUrl); 
				//解析Json字符串 
				parseJson(strResult); 
			} 
		}); 
		btnJsonMulti.setOnClickListener(new View.OnClickListener() { 
			@Override 
			public void onClick(View v) { 
				String strUrl = ServerPageUtil.getStrUrl(UrlsOfServer.JSON_SINGERS); 
				String strResult = connServerForResult(strUrl); 
				//獲得多個Singer 
				parseJsonMulti(strResult); 
			} 
		}); 
	} 
	private String connServerForResult(String strUrl) { 
		// HttpGet對象 
		HttpGet httpRequest = new HttpGet(strUrl); 
		String strResult = ""; 
		try { 
			// HttpClient對象 
			HttpClient httpClient = new DefaultHttpClient(); 
			// 獲得HttpResponse對象 
			HttpResponse httpResponse = httpClient.execute(httpRequest); 
			if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { 
				// 取得返回的數據 
				strResult = EntityUtils.toString(httpResponse.getEntity()); 
			} 
		} catch (ClientProtocolException e) { 
			tvJson.setText("protocol error"); 
			e.printStackTrace(); 
		} catch (IOException e) { 
			tvJson.setText("IO error"); 
			e.printStackTrace(); 
		} 
		return strResult; 
	} 
	// 普通Json數據解析 
	private void parseJson(String strResult) { 
		try { 
			JSONObject jsonObj = new JSONObject(strResult).getJSONObject("singer"); 
			int id = jsonObj.getInt("id"); 
			String name = jsonObj.getString("name"); 
			String gender = jsonObj.getString("gender"); 
			tvJson.setText("ID號"+id + ", 姓名:" + name + ",性別:" + gender); 
		} catch (JSONException e) { 
			System.out.println("Json parse error"); 
			e.printStackTrace(); 
		} 
	} 
    //解析多個數據的Json
	private void parseJsonMulti(String strResult) { 
		try { 
			JSONArray jsonObjs = new JSONObject(strResult).getJSONArray("singers"); 
			String s = ""; 
			for(int i = 0; i < jsonObjs.length() ; i++){ 
				JSONObject jsonObj = ((JSONObject)jsonObjs.opt(i)) 
				.getJSONObject("singer"); 
				int id = jsonObj.getInt("id"); 
				String name = jsonObj.getString("name"); 
				String gender = jsonObj.getString("gender"); 
				s +=  "ID號"+id + ", 姓名:" + name + ",性別:" + gender+ "\n" ; 
			} 
			tvJson.setText(s); 
		} catch (JSONException e) { 
			System.out.println("Jsons parse error !"); 
			e.printStackTrace(); 
		} 
	} 
} 

 

 

 

 

 

 

http://www.cnblogs.com/mcgrady/archive/2013/06/08/3127781.html

JSON的全稱是”JavaScript Object Notation”,意思是JavaScript對象表示法,它是一種基於文本,獨立於語言的輕量級數據交換格式。XML也是一種數據交換格式,為什么沒有選擇XML呢?因為XML雖然可以作為跨平台的數據交換格式,但是在JS(JavaScript的簡寫)中處理XML非常不方便,同時XML標記比數據多,增加了交換產生的流量,而JSON沒有附加的任何標記,在JS中可作為對象處理,所以我們更傾向於選擇JSON來交換數據。這篇文章主要從以下幾個方面來說明JSON。

1,JSON的兩種結構
2,認識JSON字符串
3,在JS中如何使用JSON
4,在.NET中如何使用JSON
5,總結

JSON的兩種結構

JSON有兩種表示結構,對象和數組。
對象結構以”{”大括號開始,以”}”大括號結束。中間部分由0或多個以”,”分隔的”key(關鍵字)/value(值)”對構成,關鍵字和值之間以”:”分隔,語法結構如代碼。

{
    key1:value1,
    key2:value2,
    ...
}

其中關鍵字是字符串,而值可以是字符串,數值,true,false,null,對象或數組

數組結構以”[”開始,”]”結束。中間由0或多個以”,”分隔的值列表組成,語法結構如代碼。

復制代碼
[
    {
        key1:value1,
        key2:value2 
    },
    {
         key3:value3,
         key4:value4   
    }
]
復制代碼

認識JSON字符串

之前我一直有個困惑,分不清普通字符串,json字符串和json對象的區別。經過一番研究終於給弄明白了。比如在js中。

字符串:這個很好解釋,指使用“”雙引號或’’單引號包括的字符。例如:var comStr = 'this is string';
json字符串:指的是符合json格式要求的js字符串。例如:var jsonStr = "{StudentID:'100',Name:'tmac',Hometown:'usa'}";
json對象:指符合json格式要求的js對象。例如:var jsonObj = { StudentID: "100", Name: "tmac", Hometown: "usa" };

在JS中如何使用JSON

JSON是JS的一個子集,所以可以在JS中輕松地讀,寫JSON。讀和寫JSON都有兩種方法,分別是利用”.”操作符和“[key]”的方式。
我們首先定義一個JSON對象,代碼如下。

復制代碼
var obj = {
            1: "value1",
            "2": "value2",
            count: 3,
            person: [ //數組結構JSON對象,可以嵌套使用
                        {
                            id: 1,
                            name: "張三"
                        },
                        {
                            id: 2,
                            name: "李四"
                        }
                   ],
            object: { //對象結構JSON對象
                id: 1,
                msg: "對象里的對象"    
            }
        };
復制代碼

1,從JSON中讀數據

復制代碼
function ReadJSON() {
            alert(obj.1); //會報語法錯誤,可以用alert(obj["1"]);說明數字最好不要做關鍵字
            alert(obj.2); //同上

            alert(obj.person[0].name); //或者alert(obj.person[0]["name"])
            alert(obj.object.msg); //或者alert(obj.object["msg"])
        }
復制代碼

2,向JSON中寫數據

比如要往JSON中增加一條數據,代碼如下:

function Add() { 
            //往JSON對象中增加了一條記錄
            obj.sex= "男" //或者obj["sex"]="男"
        }

增加數據后的JSON對象如圖:

json01

3,修改JSON中的數據

我們現在要修改JSON中count的值,代碼如下:

function Update() {
            obj.count = 10; //或obj["count"]=10
        }

修改后的JSON如圖。

json02

4,刪除JSON中的數據

我們現在實現從JSON中刪除count這條數據,代碼如下:

function Delete() {
            delete obj.count;
        }

刪除后的JSON如圖

json03

可以看到count已經從JSON對象中被刪除了。

5,遍歷JSON對象

可以使用for…in…循環來遍歷JSON對象中的數據,比如我們要遍歷輸出obj對象的值,代碼如下:

function Traversal() {
            for (var c in obj) {
                console.log(c + ":", obj[c]);
            }
        }

程序輸出結果為:

json04

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM