JSON的理解

JSON (JavaScript Object Notation JS對象標(biāo)記) 是一種輕量級的數(shù)據(jù)交換格式. 它采用完全獨立于編程語言的文本格式來存儲和表示數(shù)據(jù).

  • JSON 和 JS 的關(guān)系
    JSON 是JS對象的字符串表示法,它使用文本表示一個JS對象的信息.JSON本質(zhì)上是一個具有特定格式字符串, 在JS語言中使用JSON.stringify()方法把對象轉(zhuǎn)換為JSON字符串(就是字符串!). 事實上, JSON作為一種完全獨立于語言的數(shù)據(jù)交換格式 廣泛用于許多場合, 許多語言都有對應(yīng)的JSON數(shù)據(jù)格式的解析框架.

  • 為什么是JSON!
    無論是移動端APP還是Web端(這里統(tǒng)稱為"前端"),都需要和后臺進(jìn)行數(shù)據(jù)交換.
    假設(shè)一個登陸場景:我們需要把用戶名和密碼通過網(wǎng)絡(luò)請求發(fā)送給后臺,后臺返回我們一個token.
    事實上我們和后臺進(jìn)行交換的數(shù)據(jù)要比這復(fù)雜,這里首先定義一個ModelObject類存放我們需要向后臺發(fā)送的數(shù)據(jù).

class ModelObject{
        let name:String?
        let password:String?
    //我們實際開發(fā)中用到的模型要比這復(fù)雜,這里簡單化
        init(name:String, password:Stirng){
            self.name = name
            self.password = password
        }
    
        init()
        {
            name = nil
            password = nil
        }
}

假設(shè)你是移動APP端的開發(fā)者, 既然是一種數(shù)據(jù)數(shù)據(jù)交換格式,那肯定是前端與后端之間的數(shù)據(jù)交換. 你獲取用戶輸入的name 和 passWord 并初始化得到一個ModelObject對象. 現(xiàn)在你需要把這個對象發(fā)送到后臺去.
怎么做?
直接發(fā)送行不行? 要知道我們的數(shù)據(jù)都是以二進(jìn)制的形式存儲在內(nèi)存或者磁盤上的(這是數(shù)據(jù)的物理表現(xiàn)形式), 數(shù)據(jù)可能有不同的邏輯表現(xiàn)形式(我們定義不同的類就是從邏輯形式上定義數(shù)據(jù),但本質(zhì)上它的物理表現(xiàn)形式是不會變的), 010101010的電信號... 也就是二進(jìn)制流. 暫且這么理解.
理論上,如果你直接發(fā)送一個ModelObject對象的二進(jìn)制也是可以的.前提是后臺拿到這個二進(jìn)制的ModelObject對象,讀取并無誤的轉(zhuǎn)換成自己所在環(huán)境的一個所需要的對象, 如果哪天前后端統(tǒng)一了所有的語言, 或者有一個所有語言都支持的統(tǒng)一的框架,可以自動識別不同語言的二進(jìn)制對象,并且轉(zhuǎn)換成在該語言環(huán)境下的對象.
目前我們應(yīng)該怎么做?
我們應(yīng)該首先把ModelObject對象轉(zhuǎn)換成一個字典,然后通過方法把字典轉(zhuǎn)換成JSONData.

  1. 為什么需要轉(zhuǎn)成字典呢? 因為Objective-C或者Swift中沒有前面提到的那種直接把對象轉(zhuǎn)換成對應(yīng)的JSON字符串的方法.而JSON在Objective-C中恰恰對應(yīng)Foundation中的dictionary.
  2. 為什么要把字典轉(zhuǎn)換成JSONData? 因為網(wǎng)絡(luò)上傳輸數(shù)據(jù)只能通過二進(jìn)制流的方式進(jìn)行傳遞. 這里要注意統(tǒng)一編碼.不過這里傳遞的是字符流,字符是通過二進(jìn)制來表示的.

但是這里的二進(jìn)制字符流是由特定格式的,是一種叫做JSON的數(shù)據(jù)交換格式.

后臺

由于我沒有做過后臺,具體的處理流程不清楚. 不過我猜測 ,也是響應(yīng)了請求,拿到了請求中的二進(jìn)制數(shù)據(jù), 然后根據(jù)JSON的規(guī)則解析,來還原對象的值.

最后Objective-C中的JSON的解析:

在Objective-C中使用NSJSONSerialization在JSONObject(事實上就是Foundation對象)和JSONDate(JSON格式的字符串<以二進(jìn)制形式存在,這也是我們網(wǎng)絡(luò)請求后直接得到的東西>)之間進(jìn)行轉(zhuǎn)換.
這里只是簡單的使用方法舉例,具體說明請參考NSJSONSerialization

  • Creating a JSON Object:
  • JSONObjectWithData:options:error:
    Returns a Foundation object from given JSON data.
    Declaration
  • (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError * _Nullable *)error;
    Parameters
    data
    A data object containing JSON data.
    opt
    Options for reading the JSON data and creating the Foundation objects.
    For possible values, see NSJSONReadingOptions.
    error
    If an error occurs, upon return contains an NSError object with code NSPropertyListReadCorruptError that describes the problem.
    Return Value
    A Foundation object from the JSON data in data, or nil if an error occurs.

反序列化:將從服務(wù)器接收到的二進(jìn)制數(shù)據(jù)轉(zhuǎn)換成 NSDictionary / NSArray 的過程畔柔,簡化程序開發(fā),便于后續(xù)的字典轉(zhuǎn)模型

//NSData *jsonData = [jsonStr dataUsingEncoding:NSUTF8StringEncoding];  
NSDictionary *resultDic1 = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:nil];  
//得到一個Foundation對象,便于接下來轉(zhuǎn)成響應(yīng)的模型.
  • Creating JSON Data
  • dataWithJSONObject:options:error:
    Returns JSON data from a Foundation object.
    Declaration
  • (NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError * _Nullable *)error;
    Parameters
    obj
    The object from which to generate JSON data. Must not be nil.
    opt
    Options for creating the JSON data.
    See NSJSONWritingOptions for possible values.
    error
    If an internal error occurs, upon return contains an NSError object with code NSPropertyListWriteInvalidError that describes the problem.
    Return Value
    JSON data for obj, or nil if an internal error occurs. The resulting data is encoded in UTF-8.

序列化:
將字典或者數(shù)組發(fā)送給服務(wù)器之前臣樱,轉(zhuǎn)換成二進(jìn)制數(shù)據(jù)靶擦,方便網(wǎng)絡(luò)傳輸。

NSData  *jsonData = [NSJSONSerialization dataWithJSONObject:jsonObj options:NSJSONWritingPrettyPrinted error:&error];  
//NSString *jsonStr = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 

目前還在學(xué)習(xí)的道路上...
參考:

  1. http://www.cnblogs.com/QianChia/p/5760880.html
  2. https://blog.csdn.net/a547720714/article/details/66968414
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末雇毫,一起剝皮案震驚了整個濱河市玄捕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌棚放,老刑警劉巖枚粘,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異飘蚯,居然都是意外死亡馍迄,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門局骤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來攀圈,“玉大人,你說我怎么就攤上這事峦甩∽咐矗” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長撕捍。 經(jīng)常有香客問我拿穴,道長,這世上最難降的妖魔是什么忧风? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任默色,我火速辦了婚禮,結(jié)果婚禮上狮腿,老公的妹妹穿的比我還像新娘腿宰。我一直安慰自己,他們只是感情好缘厢,可當(dāng)我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布吃度。 她就那樣靜靜地躺著,像睡著了一般贴硫。 火紅的嫁衣襯著肌膚如雪椿每。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天英遭,我揣著相機與錄音间护,去河邊找鬼。 笑死挖诸,一個胖子當(dāng)著我的面吹牛汁尺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播多律,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼痴突,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了狼荞?” 一聲冷哼從身側(cè)響起辽装,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎相味,沒想到半個月后如迟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡攻走,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了此再。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昔搂。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖输拇,靈堂內(nèi)的尸體忽然破棺而出摘符,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布逛裤,位于F島的核電站瘩绒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏带族。R本人自食惡果不足惜锁荔,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蝙砌。 院中可真熱鬧阳堕,春花似錦、人聲如沸择克。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肚邢。三九已至壹堰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間骡湖,已是汗流浹背贱纠。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留勺鸦,地道東北人并巍。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像换途,于是被迫代替她去往敵國和親懊渡。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,781評論 2 354