JSON的操作

基本語法與概念

JSON全名為JavaScript Object Notation,其原意是要使用純文字的方式來取代物件導向中的物件,整個JSON物件除基本型別之外分成兩種格式:物件、陣列,其中物件語法結構如下:

上面圖像表示JSON物件為使用"{"與"}"組成的文字,左右大括弧中間則是包含一個以上的"string:value",我們稱為key-value pair,其中key必須為string格式,而value則可以為原生型別或是JSON物件(形成階層式的JSON物件)。

而陣列則可以包含著基本型別與JSON物件,其語法結構如下:

上面圖像表示JSON陣列為"["與"]"所組成的一串文字,左右中括弧間則是包含一個以上的value,此value可以試原生型別或是JSON物件甚至是JSON陣列。

JavaScript中的JSON操作

在JavaScript中,新增一個空的JSON物件可以這樣做:

var json = {};

上面json則為一個空的JSON物件。而當需要在其中增加屬性與其對應的值,可以:

var json = { "key" : "value" };

或是

var json = {};
json.key = 'value';

或是

var json = {};
json['key'] = 'value';

由上面的例子可以看出,我們可以將JSON物件當做一個真實的物件,然後透過"."來操作其下的值,也可以使用json['key']的操縱陣列的方式來呼叫其下的值,而操作的定義則包含新增與修改。

var json = {};
//新增一個屬性
json.key1 = "value1";
//修改key1
json.key1 = "value2";

由此可見,JSON物件是一個可以動態增長的物件,並且可以透過簡單的方式直接操作。

附註:在JSON...嚴格說是JavaScript中,單引號('')與雙引號(""),代表的事同一件事情,就是隔絕一段文字,所以如果文字中有單引號或雙引號,除了使用跳脫字元,也可以交叉使用單引號或雙引號來代替。

減少一個node(屬性)

上面範例已經把新增屬性(我喜歡稱為node)跟更新的方式展示過,但是,如果要刪除一個屬性的話,可以透過delete這個指令動作:

var a = {"aaa":123, "bbb":223};
console.log(a); //顯示{ aaa: 123, bbb: 223 }

delete a.aaa;
console.log(a); //顯示{ bbb: 223 }

而如果你操作的是JSON陣列,則可以透過underscorejs這樣做:

var _ = require('underscore');
var a = [1,2,3,4,5,6]
//將2與3刪除
var result = _.difference(a, [2,3]);
console.log(result);

結果:

# node examples/basic/json/sample01.js
[ 1, 4, 5, 6 ]

如果複雜一點,當在操作包含JSON物件或不定值的JSON陣列時,可以這樣做:

var _ = require('underscore');

var arr = [
  {"aaa": [1,2,3]},
  {
    "bbb": 
    {
      a: 111,
      b: 222
    }
  }
];

console.log('Before...');
console.log(arr);

arr = _.reject(arr, function(v){
  if(v.aaa) return true;
  return false;
});

console.log('After...');
console.log(arr);

結果:

node examples/basic/json/sample02.js
Before...
[ { aaa: [ 1, 2, 3 ] }, { bbb: { a: 111, b: 222 } } ]
After...
[ { bbb: { a: 111, b: 222 } } ]

以上,感謝underscore的作者,太佛心來著的~!

node可以是function,而且可以操作

我本身常用JSON來做另一件事情...整理測試code...,可以把一些測試function寫在一支json下面,然後最後透過指令列參數來動態帶入要執行的function是哪一個...

//整理測試範例
var dbo = {
  create : function(){
    //do create
  },
  query : function(){
    //do query
  },
  delete : function(){
    //do delete
  },
  update: function(){
    //do update
  }
}

//執行測試
dbo[process.argv[2]]();

而執行上面的程式只要:

# node test.js create

想測試update的時候,可以把create換成update就好...

由上面的範例可知,如果希望組織您的code變成階層式的語意,例如在Java中的System.out.println這樣的一個function,則可以這樣寫:

var System = {
  out: {
    println: function(msg) {
      console.log(msg);
    }
  }
}

//則程式可以這樣呼叫
System.out.println('HELLO!');

語意的部份,見仁見智,一般好解讀的程式會更吸引開發者使用喔!

results matching ""

    No results matching ""