json總結

zhyp29發表於2016-05-10
JSON(JavaScript Object Notation) 是一種輕量級的資料交換格式,採用完全獨立於語言的文字格式,是理想的資料交換格式。同時,JSON是 JavaScript 原生格式,這意味著在 JavaScript 中處理 JSON資料不須要任何特殊的 API 或工具包。

    本文主要是對JS操作JSON的要領做下總結。

    在JSON中,有兩種結構:物件和陣列。

    1. 一個物件以“{”(左括號)開始,“}”(右括號)結束。每個“名稱”後跟一個“:”(冒號);“‘名稱/值’ 對”之間運用 “,”(逗號)分隔。 名稱用引號括起來;值如果是字串則必須用括號,數值型則不須要。例如:

    var o={"xlid":"cxh","xldigitid":123456,"topscore":2000,"topplaytime":"2009-08-20"};

    2. 陣列是值(value)的有序集合。一個陣列以“[”(左中括號)開始,“]”(右中括號)結束。值之間運用 “,”(逗號)分隔。

    例如:

    var jsonranklist=[{"xlid":"cxh","xldigitid":123456,"topscore":2000,"topplaytime":"2009-08-20"},{"xlid":"zd","xldigitid":123456,"topscore":1500,"topplaytime":"2009-11-20"}];


 
2. 陣列是值(value)的有序集合。一個陣列以“[” 開始,“]”結束。值之間運用 “,”分隔。例如:
 
var jsonList=
[
{
"str":"abc",
"intstr":1322323456,
"max":6753,
"time":"2012-10-19"
},     
{
"str":"cde",
"intstr":782144556,
"max":15400,
"time":"2012-10-19"
}
];

 
一個詳細的 json 格式資料例項
 
 

// 描述一個人

var person = {
"Name": "Bob",
"Age": 32,
"Company": "IBM",
"Engineer": true
}

// 獲取這個人的資訊

var personAge = person.Age;

// 描述幾個人

var members = [
{
"Name": "Bob",
"Age": 32,
"Company": "IBM",
"Engineer": true
},
{
"Name": "John",
"Age": 20,
"Company": "Oracle",
"Engineer": false
},
{
"Name": "Henry",
"Age": 45,
"Company": "Microsoft",
"Engineer": false
}
]

// 讀取其中John的公司名稱

var johnsCompany = members[1].Company;

// 描述一次會議

var conference = {
"Conference": "Future Marketing",
"Date": "2012-6-1",
"Address": "Beijing",
"Members":
[
{
"Name": "Bob",
"Age": 32,
"Company": "IBM",
"Engineer": true
},
{
"Name": "John",
"Age": 20,
"Company": "Oracle",
"Engineer": false
},
{
"Name": "Henry",
"Age": 45,
"Company": "Microsoft",
"Engineer": false
}
]
}

// 讀取參會者Henry是否工程師

var henryIsAnEngineer = conference.Members[2].Engineer;
 

    為了方便地處理JSON資料,JSON提供了json.js包,下載地址:http://www.json.org/json.js

    在資料傳輸流程中,json是以文字,即字串的形式傳遞的,而JS操作的是JSON物件,所以,JSON物件和JSON字串之間的相互轉換是關鍵。例如:

    JSON字串:

    var str1 = '{ "name": "cxh", "sex": "man" }';

    JSON物件:

    var str2 = { "name": "cxh", "sex": "man" };

    一、JSON字串轉換為JSON物件

    要運用上面的str1,必須運用下面的要領先轉化為JSON物件:

    //由JSON字串轉換為JSON物件

    var obj = eval('(' + str + ')');

或者

    var obj = str.parseJSON(); //由JSON字串轉換為JSON物件

    或者

    var obj = JSON.parse(str); //由JSON字串轉換為JSON物件

    然後,就可以這樣讀取:

    Alert(obj.name);

    Alert(obj.sex);

    特別留心:如果obj本來就是一個JSON物件,那麼運用 eval()函式轉換後(哪怕是多次轉換)還是JSON物件,但是運用 parseJSON()函式處理後會有疑問(丟擲語法異常)。

    二、可以運用 toJSONString()或者全域性要領 JSON.stringify()將JSON物件轉化為JSON字串。

    例如:

    var last=obj.toJSONString(); //將JSON物件轉化為JSON字元

    或者

    var last=JSON.stringify(obj); //將JSON物件轉化為JSON字元

    alert(last);

    留心:

    上面的多個要領中,除了eval()函式是js自帶的之外,其他的多個要領都來自json.js包。新版本的 JSON 修改了 API,將 JSON.stringify() 和 JSON.parse() 兩個要領都注入到了 Javascript 的內建物件裡面,前者變成了 Object.toJSONString(),而後者變成了 String.parseJSON()。如果提示找不到toJSONString()和parseJSON()要領,則說明您的json包版本太低。


JSON簡介
JSON: JavaScrip 物件表示法(JavaScrip Object Notation)
JSON是儲存和交換文字資訊的語法。
·JSON是輕量級的文字資料交換格式
·JSON獨立於語言和平臺
·JSON具有自我描述性,更易理解

JSON與XML
JSON類似XML,比XML更小,更快,更易解析。
·沒有結束標籤
·更短
·讀寫的速度更快
·使用陣列
·不使用保留字

JSON語法
·資料在name-value對中
·資料由逗號分隔
·花括號儲存物件
·方括號儲存陣列
·value可以是數字(int,float)、字串(雙引號中)、布林值、陣列(方括號中)、物件(花括號中)、null

JSON物件
JSON物件在花括號中書寫,物件可以包含多個name-value對:
{"firstName":"John","lastName":"Doe"}

JSON陣列
JSON陣列在方括號中書寫,陣列可以包含多個物件:
根部的{}表示這是一個整體的JSON物件,"employees"表示其中一個鍵,這個鍵比較特別,它對應的值是一個JSON陣列,這個陣列中又包含了3個JSON物件。注意陣列中的每個值也需要用逗號隔開。

{
"employees":[
{"firstName":"John","lastName":"Doe"},
{"firstName":"Anna","lastName":"Smith"},
{"firstName":"Peter","lastName":"Jones"}
],
"animal","cat"
}
其實有點類似:
List<Map<String, Object>> listItems = new ArrayList<Map<String, Object>>();
Map<String, Object>listItem = new HashMap<String, Object>( );
或者(ExpanableListView用到):
List<String> names = new ArrayList<String>( );
List<ArrayList<String>> details = new ArrayList<ArrayList<String>>( );
讀取JSON資料
assets/test.json

{
"languages":[
{"id":1,"ide":"Eclipse","name":"Java"},
{"id":2,"ide":"XCode","name":"Swift"},
{"id":3,"ide":"Visual Studio","name":"C#"},
],
"cat","it"
}
try {
InputStream is = getResources().getAssets().open("test.json");
InputStreamReader isr = new InputStreamReader(is, "UTF-8");
BufferedReader br = new BufferedReader(isr);
//將文字中的資料,都讀取到一個StringBuilder當中
String line;
StringBuilder builder = new StringBuilder();
while((line=br.readLine()) != null ){
builder.append(line);
}
br.close();
isr.close();

JSONObject root = new JSONObject(builder.toString());
//根據鍵,獲得鍵對應的值,由於值是String型別,所以用getString
System.out.println("cat="+root.getString("cat"));
//根據鍵,獲得鍵對應的陣列,由於值是一個陣列,所以用getJSONArray
JSONArray array = root.getJSONArray("languages");
//由於要遍歷陣列,所以建立一個for迴圈
for(int i=0; i < array. length(); i++){
//由於每一個陣列當中的元素,也是一個新的JSON物件
JSONObject lan = array.getJSONObject(i);
System.out.println("-------------------");
System.out.println("id="+lan.getInt("id"));
System.out.println("ide="+lan.getString("name"));
System.out.println("name="+lan.getString("name"));
Log.i("tag","-------");
}

} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
建立JSON資料

try {
//首先建立物件中的一個單個鍵值對
JSONObject root = new JSONObject();
root.put("cat", "it");
//另一個鍵值對的值是一個陣列,陣列裡裝了3個JSON物件,所以再分別搞3個JSONObject物件存放鍵值對
JSONObject lan1 = new JSONObject();
lan1.put("id", "1");
lan1.put("ide", "Eclipse");
lan1.put("name","Java");
JSONObject lan2 = new JSONObject();
lan2.put("id", "2");
lan2.put("ide", "XCode");
lan2.put("name","Swift");
JSONObject lan3 = new JSONObject();
lan3.put("id", "2");
lan3.put("ide", "Visual Studio");
lan3.put("name","C#");
//在將這3個物件存入一個陣列
JSONArray array = new JSONArray();
array.put(lan1);
array.put(lan2);
array.put(lan3);
//再將陣列作為鍵"languages"的值,構成一個物件
root.put("languages", array);
//本例中只將內容輸出出來
System.out.println(root.toString());

} catch (JSONException e) {
e.printStackTrace();
}

1、要使用JSON,先下下載json.js檔案。下載地址:https://github.com/douglascrockford/JSON-js
Js程式碼  
定義一個json物件  
var jsonObject={};  
給物件屬性賦值  
jsonObject.productId=123;  
jsonObject.singleType=1;  
  
json陣列  
var jsonArray = new Array();  
jsonArray.push(jsonObject);  
可以用jquery的each進行迴圈  
$.each(jsonArray,function(index,jsonObject){  
  
})  
  
從json物件獲取值  
var productId=jsonObject.productId;  
  
將json物件轉換成字串,用於將值放到隱藏域傳到後臺  
var jsonString  = JSON.stringify(jsonObject);  
{"productId":123,"singleType":1}  
  
JSON這個工具下面的兩個js工具類提供的,已經在模板上對所有ftl頁面進行引用了         
  
如果是轉換陣列結果為  
[{"productId":123,"singleType":1},{"productId":456,"singleType":2}]  
  
將json格式字串轉換成物件,用於從隱藏域獲取value後,轉換成物件來操作  
var jsonObject = JSON.parse('{"productId":123,"singleType":1}');  
var jsonArray = JSON.parse('[{"productId":123,"singleType":1},{"productId":456,"singleType":2}]');  
  
java:  
隱藏域中的json字串傳到後臺後轉換成JSONObject物件  
JSONObject jb = JSONObject.fromObject("{\"productId\":123,\"singleType\":1}");  
從jsonobject獲取屬性  
Long productId = jb.getLong("productId");  
Double price = jb.getDouble("price");  
如果jb中沒有productId屬性,則會拋異常  
  
json陣列JSONArray  
JSONArray js = JSONArray.fromObject("[{\"productId\":123,\"singleType\":1},{\"productId\":456,\"singleType\":2}]");  
然後迴圈成JSONObject來獲取屬性  


js中json操作——函式構造法、eval、JSON.stringify、JSON.parse

chape 釋出於 3年前,共有 0 條評論


函式構造定義法返回

var strJSON = "{name:'json name'}";//得到的JSON
var obj = new Function("return" + strJSON)();//轉換後的JSON物件
alert(obj.name);//json name


js中著名的eval函式

var strJSON = "{name:'json name'}";//得到的JSON
var obj = eval( "(" + strJSON + ")" );//轉換後的JSON物件
alert(obj.name);//json name
注意:物件表示式{'name':'json name'}必須用“()”擴住,否則
var strJSON = "{name:'json name'}";
var obj = eval(strJSON);
alert(obj.constructor);//String 建構函式
alert(obj.name);//undefine
必須把物件表示式擴起來eval執行才能生成一個匿名物件!

JSON.stringify方法

作用:這個函式的作用主要是為了系列化物件的。  
        可能有些人對系列化這個詞過敏,我的理解很簡單。就是說把原來是物件的型別轉換成字串型別(或者更確切的說是json型別的)。就這麼簡單。打個比方說,你有一個類,那麼你可以通過這個方法轉換成相應的json型別的。
語法:  
JSON.stringify(value [, replacer] [, space]) 
value:是必須要的欄位。就是你輸入的物件,比如陣列啊,類啊等等。 
replacer:這個是可選的。它又分為2種方式,一種是方法,第二種是陣列。 
情況一:我們先說資料,通過我們後面的實驗可以知道,它是和第一個有關係的。一般來說,我們系列化後的結果是通過鍵值對來進行表示的。 
比如說: 
name:"lan",age:25 
所以,如果這種形式的話,如果第二個的值在第一個存在,那麼的話就以第二個的值做key,第一個值為value進行表示,如果不存在,sorry,忽略。【是不是有點抽象,我也這麼覺得,不過你等一下看實驗 就OK了。。呼呼。】 
情況二:如果是方法,那很簡單,就是說把系列化後的每一個物件(記住 是每一個)傳進方法裡面進行處理。 
space:很好理解,用什麼來做分隔符的。 
1.如果省略的話,那麼顯示出來的值 就沒有分隔符。直接輸出來 
2.如果是一個數字的話,那麼它就定義縮排幾個字元,當然 如果大於10 ,則最大值為10. 
3.如果是一些轉義字元,比如“\t”,表示回車,那麼它每行一個回車。 
4.如果僅僅是字串,OK,就在每行輸出值的時候把這些字串附加上去就OK。當然,最大長度也是10個字元。 
開始用例項說明;  
1.只有一個引數的情況下:  
var student = new Object();
student.name = "Lanny";
student.age = "25";
student.location = "China";
var json = JSON.stringify(student);
alert(student);

結果如下: 

有些人可能會懷疑JSON.stringify的作用,OK。那假如,我們不要這個函式。程式碼下面的樣子:  
var student = new Object();
student.name = "Lanny";
student.age = "25";
student.location = "China";

// var json = JSON.stringify(student);
alert(student);

 恭喜你 得到的結果是: 


2.第二個引數存在,並且第二個引數還是function的時候 

var students = new Array() ;
students[0] = "Lanny";
students[1] = "dong";
students[2] = "I love you";
var json = JSON.stringify(students,switchUpper);
function switchUpper(key, value) {
return value.toString().toUpperCase();
}
alert(json);

//var json = JSON.stringify(students, function (key,value) {
//return value.toString().toUpperCase();
//});
 上面的方法也可以換成下面的,2個都是一樣,只是寫法有那麼一點點的不一樣而已。 
 得到結果如下: 

3.第二個引數存在,並且第二個引數不是function,而是陣列的時候。 
3.1 【誤區】如果第一個引數是陣列,第二個引數也是陣列的話,只顯示第一個引數的值。 
比如:

var students = new Array() ;
students[0] = "Lanny";
students[1] = "dong";
students[2] = "I love you";
var stu = new Array();
stu[0] = "1";
stu[1] = "2";
var json = JSON.stringify(students,stu);
alert(json);
得到的結果就是: 

第二個被忽略了,只是第一個被系列化了。 

3.2 如果第一個是物件(這裡說的物件就像在C#裡面可以進行new的),第二個是陣列的。 

那麼如果第二個的value在第一個存在,那麼的話就以第二個的值做key,第一個值為value進行表示  
var student = new Object();
student.qq = "5485891512";
student.name = "Lanny";
student.age = 25;

var stu = new Array();
stu[0] = "qq";
stu[1] = "age";
stu[2] = "Hi";//這個student物件裡不存在。

var json = JSON.stringify(student,stu);
alert(json);

 得到的結果如下: 

因為stu[2] = "Hi";這個Hi 在第一個找不到,所以就不進行顯示了。 

4.第三個引數 

4.1.如果省略的話,那麼顯示出來的值 就沒有分隔符。直接輸出來 

比如: 
var student = new Object();
student.qq = "5485891512";
student.name = "Lanny";
student.age = 25;

var stu = new Array();
stu[0] = "qq";
stu[1] = "age";
stu[2] = "Hi";

var json = JSON.stringify(student,stu);
alert(json);

 輸出的就是: 

4.2.如果是一個數字的話,那麼它就定義縮排幾個字元,當然 如果大於10 ,則最大值為10.  

var student = new Object();
student.qq = "5485891512";
student.name = "Lanny";
student.age = 25;

var stu = new Array();
stu[0] = "qq";
stu[1] = "age";
stu[2] = "Hi";

var json = JSON.stringify(student,stu,100);//注意這裡的100
alert(json);

那麼得到的是: 

空開來了10個字元。 

4.3.如果是一些轉義字元,比如“\t”,表示回車,那麼它每行一個回車。 

也是一樣。 

4.4.如果僅僅是字串,OK,就在每行輸出值的時候把這些字串附加上去就OK。當然,最大長度也是10個字元。 

如果是var json = JSON.stringify(student,stu,“HaiKou”);//


JSON.parse(text, reviver)方法


引數:

text必需。 一個有效的 JSON 字串。

reviver可選。 一個轉換結果的函式。 將為物件的每個成員呼叫此函式。 如果成員包含巢狀物件,則先於父物件轉換巢狀物件。 對於每個成員,會發生以下情況:

如果 reviver 返回一個有效值,則成員值將替換為轉換後的值。
如果 reviver 返回它接收的相同值,則不修改成員值。
如果 reviver 返回 null 或 undefined,則刪除成員。

返回值:

一個物件或陣列。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>JSON.parse()</title>
<script type="text/javascript" src="json2.js"></script>
<script type="text/javascript">
var data='{'
+'"root":'
+'['
+'{"name":"1","value":"0"},'
+'{"name":"6101","value":"西安市"},'
+'{"name":"6102","value":"銅川市"},'
+'{"name":"6103","value":"寶雞市"},'
+'{"name":"6104","value":"咸陽市"},'
+'{"name":"6105","value":"渭南市"},'
+'{"name":"6106","value":"延安市"},'
+'{"name":"6107","value":"漢中市"},'
+'{"name":"6108","value":"榆林市"},'
+'{"name":"6109","value":"安康市"},'
+'{"name":"6110","value":"商洛市"}'
+']'
+'}';



//示例1:此示例使用 JSON.parse 將 JSON 字串轉換為物件
var jsontext = '{"firstname":"Jesper","surname":"Aaberg","phone":["555-0100","555-0120"]}';
var contact = JSON.parse(jsontext);
document.write(contact.surname + ", " + contact.firstname + ", "+ contact.phone);



//dateReviver
//var dateObj = new Date(Date.UTC('2008', +'01' - 1, +'01', +'12', +'00', +'00'))
//alert(dateObj.toUTCString())

//示例2:此示例使用 JSON.parse 反序列化 ISO 格式的日期字串, 將返回Date格式物件。
var jsontext2 = '{ "hiredate": "2008-01-01T12:00:00Z", "birthdate": "2008-12-25T12:00:00Z" }';
var dates = JSON.parse(jsontext2, dateReviver);
document.write("<br /><br />"+dates.birthdate.toUTCString());
function dateReviver(key, value) {
var a;
if (typeof value === 'string') {
a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
if (a) {
return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
+a[5], +a[6]));
}
}
return value;
};

</script>
</head>
<body>
</body>
</html>

上面程式碼中有示例1功能為將json字串轉化為json物件。(注意!json字串的格式一定要標準,key和value一定要用雙引號包括,否則會出線示例2功能介紹reviver修改返回結果的功能。

jquery物件轉json  jquery.json.js使用
例項
<html>
<head>
<title>jquery物件轉json  jquery.json.js使用</title>
<meta charset="utf-8" />
<script src="jquery-1.9.1.js"></script>
<script src="jquery.json.js"></script>
<script>
$(function(){
var obj=new Object();
obj.name="張三";
obj.age="12";
obj.job="php";
var strjson = $.toJSON(obj);
$(".strjson").text(strjson);
//alert(strjson);
});
</script>
</head>
<body>
<div>
物件:<pre style="color:red;">
var obj=new Object();
obj.name="張三";
obj.age="12";
obj.job="php";</pre>
</div>
<div>
json字串:<span class="strjson">var obj ={name:"andy",age:20,job:"javascript"};</span>
</div>
</body>
</html>
2
$(function(){
var obj=new Object();
obj.name="張三";
obj.age="12";
obj.job="php";
//轉換成json字串
var strjson = $.toJSON(obj);
$(".strjson").text(strjson);
//alert(strjson);
});

//下面是對json物件的增刪查改操作

//宣告json物件

var jsonObj2={persons:[{name:"jordan",sex:"m",age:"40"}, {name:"bryant",sex:"m",age:"28"}, {name:"McGrady",sex:"m",age:"27"} ]};

var persons=jsonObj2.persons;
var str="";

var person={name:"yaoMing",sex:"m",age:"26"};
//以下為json物件的操作,去掉註釋可以檢視操作結果
//jsonObj2.persons.push(person);//陣列最後加一條記錄
//jsonObj2.persons.pop();//刪除最後一項
//jsonObj2.persons.shift();//刪除第一項
jsonObj2.persons.unshift(person);//陣列最前面加一條記錄 只要適合Javascript的方法都是可以用在JSON物件的陣列中的!所以還有另外的方法splice( )進行crud操作! //刪除
//jsonObj2.persons.splice(0,2);//開始位置,刪除個數
//替換不刪除
var self={name:"tom",sex:"m",age:"24"};
var brother={name:"Mike",sex:"m",age:"29"};
jsonObj2.persons.splice(1,0,self,brother,self);//開始位置,刪除個數,插入物件
//替換並刪除
//jsonObj2.persons.splice(0,1,self,brother);//開始位置,刪除個數,插入物件

for(var i=0;i<persons.length;i++){ var cur_person=persons[i]; str+=cur_person.name+"'sex is "+cur_person.sex+" and age is "+cur_person.age+"<br><br>"; }
document.writeln(str);
//轉換為json文字
var myjsonobj = JSON.stringify(jsonObj2);
document.writeln(myjsonobj);
</script>


 

相關文章