JS系列之JSON

JSON 值

JSON 值能夠是:web

  • 數字(整數或浮點數)
  • 字符串(在雙引號中)
  • 邏輯值(true 或 false)
  • 數組(在中括號中)
  • 對象(在大括號中)
  • null

JSON 文件

JSON 文件的文件類型是 ".json"
JSON 文本的 MIME 類型是 "application/json"json

規則

  1. 對象和數組
  • 屬性名稱必須是雙引號括起來的字符串
  • 最後一個屬性後不能有逗號
  1. 數值
  • 禁止出現前導零( JSON.stringify 方法自動忽略前導零,而在 JSON.parse 方法中將會拋出 SyntaxError)
  • 若是有小數點, 則後面至少跟着一位數字
  1. 字符串
  • 字符串必須用雙引號括起來

方法

JSON.stringify

JSON.stringify(value[, replacer[, space]])

replacer:
可選。用於轉換結果的函數或數組。數組

var str = {"name":"haha", "age":20};

JSON.stringify(str);   // {"name":"haha","age":20}

做爲函數,它有兩個參數,鍵(key)值(value)都會被序列化。app

過濾函數以對象中的每個屬性和值做爲輸入,返回值有如下幾種狀況:函數

  • 若是返回一個 Number, 轉換成相應的字符串被添加入JSON字符串。
  • 若是返回一個 String, 該字符串做爲屬性值被添加入JSON。
  • 若是返回一個 Boolean, "true" 或者 "false"被做爲屬性值被添加入JSON字符串
  • 返回undefined表示忽略該屬性
  • 返回對象將會觸發遞歸調用知道遇到基本類型的屬性
  • 返回沒法stringify的值將會被忽略
JSON.stringify(str, function(key, val){
  console.log("key is ", key);
  console.log("val is  ", typeof(val));
  return val;
}

//======================
key is 
val is object
key is name
val is string
key is age
val is number

// {"name":"haha","age":20}
function replacer(key, value) {
  if (typeof value === "string") {
    return undefined;
  }
  return value;
}

var foo = {foundation: "Mozilla", model: "box", week: 45, transport: "car", month: 7};
var jsonString = JSON.stringify(foo, replacer); 
// {"week":45,"month":7}

若是 replacer 是一個數組,則僅轉換該數組中具備鍵值的成員。成員的轉換順序與鍵在數組中的順序同樣。url

JSON.stringify(str, ["name", "haha", "kk"]);

// {"name":"haha"}

space:
可選,文本添加縮進、空格和換行符,若是 space 是一個數字,則返回值文本在每一個級別縮進指定數目的空格,若是 space 大於 10,則文本縮進 10 個空格。space 也能夠使用非數字,如:t。spa

JSON.stringify(str, null, 4);

//
{
    "name": "haha",
    "age": 20
}

toJSON()

若是一個被序列化的對象擁有 toJSON 方法,那麼該 toJSON 方法就會覆蓋該對象默認的序列化行爲。code

var data = {
  name:"niuzai",
  info:{
    age:18,
    sex:"male"
  },
  toJSON:function(){
    return "by toJSON";
  }
};

JSON.stringify(data);
//""by toJSON"";

JSON.parse()

JSON.parse(text[, reviver])

reviver:
可選,一個函數,它用來轉換已經被從text字符串轉爲對象的對象,規則以下:對象

  1. 若是reviver返回一個有效值,則對應的屬性值將替換爲轉換後的值。
  2. 若是reviver返回它接收的相同值,則不修改對應屬性值。
  3. 若是reviver返回undefined,則刪除對應的屬性
function reviver(key,value){
  if(key=="webName"){
    return "antzone";
  }
  return value;
}
var jsonStr='{"webName":"螞蟻部落","url":"softwhy.com","age":"2"}';
var obj=JSON.parse(jsonStr,reviver);
console.log(obj);

//
{
    age: "2",
    url: "softwhy.com",
    webName: "antzone"
}
相關文章
相關標籤/搜索