IOS開發之JSON格式數據的生成與解析

来源:http://www.cnblogs.com/Jepson1218/archive/2016/01/31/5173468.html
-Advertisement-
Play Games

本文將從四個方面對IOS開發中JSON格式數據的生成與解析進行講解: 一、JSON是什麼? 二、我們為什麼要用JSON格式的數據? 三、如何生成JSON格式的數據? 四、如何解析JSON格式的數據? JSON格式取代了xml給網路傳輸帶來了很大的便利,但是卻沒有了xml的一目瞭然,尤其是json數據


 本文將從四個方面對IOS開發中JSON格式數據的生成與解析進行講解:


 

一、JSON是什麼?

二、我們為什麼要用JSON格式的數據?

三、如何生成JSON格式的數據?

四、如何解析JSON格式的數據?

   JSON格式取代了xml給網路傳輸帶來了很大的便利,但是卻沒有了xml的一目瞭然,尤其是json數據很長的時候,我們會陷入繁瑣複雜的數據節點查找中。這時我們就需要一款線上校驗工具 BeJson。 


 

一、JSON是什麼?

  JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。它基於ECMAScript的一個子集。 JSON採用完全獨立於語言的文本格式,但是也使用了類似於C語言家族的習慣(包括C、C++、C#、Java、JavaScript、Perl、Python等)。這些特性使JSON成為理想的數據交換語言。 易於人閱讀和編寫,同時也易於機器解析和生成(一般用於提升網路傳輸速率)。

JSON數據主要有兩種數據結構,一種是鍵/值,另一種是數組的形式來表示。

1、JSON 數據的書寫格式是:名稱/值對。如:

{"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"}

 

2、JSON 數據的書寫格式是:數組格式,當需要表示一組值時,JSON 不但能夠提高可讀性,而且可以減少複雜性。如:

{
    "programmers": [{
        "firstName": "Brett",
        "lastName": "McLaughlin",
        "email": "aaaa"
    }, {
        "firstName": "Elliotte",
        "lastName": "Harold",
        "email": "cccc"
    }],
    "authors": [{
        "firstName": "Isaac",
        "lastName": "Asimov",
        "genre": "sciencefiction"
    }, {
        "firstName": "Frank",
        "lastName": "Peretti",
        "genre": "christianfiction"
    }],
    "musicians": [{
        "firstName": "Eric",
        "lastName": "Clapton",
        "instrument": "guitar"
    }, {
        "firstName": "Sergei",
        "lastName": "Rachmaninoff",
        "instrument": "piano"
    }]
}

 

 

 


二、我們為什麼要用JSON格式的數據?

  JSON 可以將 JavaScript 對象中表示的一組數據轉換為字元串,然後就可以在函數之間輕鬆地傳遞這個字元串,或者在非同步應用程式中將字元串從 Web 客戶機傳遞給伺服器端程式。這個字元串看起來有點兒古怪,但是JavaScript很容易解釋它,而且 JSON 可以表示比"名稱 / 值對"更複雜的結構。例如,可以表示數組和複雜的對象,而不僅僅是鍵和值的簡單列表。

  JSON作為數據包格式傳輸的時候具有更高的效率,這是因為JSON不像XML那樣需要有嚴格的閉合標簽,這就讓有效數據量與總數據包比大大提升,從而減少同等數據流量的情況下,網路的傳輸壓力。

 


 三、如何生成JSON格式的數據?

1、利用字典NSDictionary轉換為鍵/值格式的數據。

// 如果數組或者字典中存儲了  NSString, NSNumber, NSArray, NSDictionary, or NSNull 之外的其他對象,就不能直接保存成文件了.也不能序列化成 JSON 數據.
    NSDictionary *dict = @{@"name" : @"me", @"do" : @"something", @"with" : @"her", @"address" : @"home"};
    
    // 1.判斷當前對象是否能夠轉換成JSON數據.
    // YES if obj can be converted to JSON data, otherwise NO
    BOOL isYes = [NSJSONSerialization isValidJSONObject:dict];
    
    if (isYes) {
        NSLog(@"可以轉換");
        
        /* JSON data for obj, or nil if an internal error occurs. The resulting data is a encoded in UTF-8.
         */
        NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:0 error:NULL];
        
        /*
         Writes the bytes in the receiver to the file specified by a given path.
         YES if the operation succeeds, otherwise NO
         */
        // 將JSON數據寫成文件
        // 文件添加尾碼名: 告訴別人當前文件的類型.
        // 註意: AFN是通過文件類型來確定數據類型的!如果不添加類型,有可能識別不了! 自己最好添加文件類型.
        [jsonData writeToFile:@"/Users/SunnyBoy/Sites/JSON_XML/dict.json" atomically:YES];
        
        NSLog(@"%@", [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]);
        
    } else {
        
        NSLog(@"JSON數據生成失敗,請檢查數據格式");
        
    }

 

 2、通過JSON序列化可以轉換數組,但轉換結果不是標準化的JSON格式。

   NSArray *array = @[@"qn", @18, @"ya", @"wj"];
    
    BOOL isYes = [NSJSONSerialization isValidJSONObject:array];
    
    if (isYes) {
        NSLog(@"可以轉換");
        
        NSData *data = [NSJSONSerialization dataWithJSONObject:array options:0 error:NULL];
        
        [data writeToFile:@"/Users/SunnyBoy/Sites/JSON_XML/base" atomically:YES];
    
    } else {
        
        NSLog(@"JSON數據生成失敗,請檢查數據格式");
        
    }

 

 


四、如何解析JSON格式的數據?

1、使用TouchJSon解析方法:(需導入包:#import "TouchJson/JSON/CJSONDeserializer.h")

//使用TouchJson來解析北京的天氣
//獲取API介面
NSURL *url = [NSURL URLWithString:@"http://m.weather.com.cn/data/101010100.html"];

//定義一個NSError對象,用於捕獲錯誤信息
NSError *error;
NSString *jsonString = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];

NSLog(@"jsonString--->%@",jsonString);

//將解析得到的內容存放字典中,編碼格式為UTF8,防止取值的時候發生亂碼
NSDictionary *rootDic = [[CJSONDeserializer deserializer] deserialize:[jsonString dataUsingEncoding:NSUTF8StringEncoding] error:&error];

//因為返回的Json文件有兩層,去第二層內容放到字典中去
NSDictionary *weatherInfo = [rootDic objectForKey:@"weatherinfo"];
NSLog(@"weatherInfo--->%@",weatherInfo);

//取值列印
NSLog(@"%@",[NSString stringWithFormat:@"今天是 %@  %@  %@  的天氣狀況是:%@  %@ ",[weatherInfo objectForKey:@"date_y"],[weatherInfo objectForKey:@"week"],[weatherInfo objectForKey:@"city"], [weatherInfo objectForKey:@"weather1"], [weatherInfo objectForKey:@"temp1"]]);

 

 2、使用SBJson解析方法:(需導入包:#import "SBJson/SBJson.h")

//使用SBJson解析北京的天氣
NSURL *url = [NSURL URLWithString:@"http://www.weather.com.cn/adat/sk/101010100.html"];

NSError *error = nil;

NSString *jsonString = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];

SBJsonParser *parser = [[SBJsonParser alloc] init];

NSDictionary *rootDic = [parser objectWithString:jsonString error:&error];

NSDictionary *weatherInfo = [rootDic objectForKey:@"weatherinfo"];

NSLog(@"%@", [NSString stringWithFormat:@"今天是 %@  %@  %@  的天氣狀況是:%@  %@ ",[weatherInfo objectForKey:@"date_y"],[weatherInfo objectForKey:@"week"],[weatherInfo objectForKey:@"city"], [weatherInfo objectForKey:@"weather1"], [weatherInfo objectForKey:@"temp1"]]);

  

3、使用IOS5自帶解析類NSJSONSerialization方法解析:(無需導入包,IOS5支持,低版本IOS不支持)

// 從中國天氣預報網請求數據
    NSURL *url = [ NSURL URLWithString:@"http://www.weather.com.cn/adat/sk/101010100.html"];
    
    // 創建請求
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
    [[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
        // 在網路完成的 Block 回調中,要增加錯誤機制.
        // 失敗機制處理: 錯誤的狀態碼!
        
        // 最簡單的錯誤處理機制:
        if (data && !error) {
            
            // JSON格式轉換成字典,IOS5中自帶解析類NSJSONSerialization從response中解析出數據放到字典中
            id obj = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
            
            NSDictionary *dict = obj[@"weatherinfo"];
            
            NSLog(@"%@---%@", dict, dict[@"city"]);
        }
        
    }] resume];

 

4、使用JSONKit的解析方法:(需導入包:#import "JSONKit/JSONKit.h")

//如果json是“單層”的,即value都是字元串、數字,可以使用objectFromJSONString
NSString *json1 = @"{\"a\":123, \"b\":\"abc\"}";
NSLog(@"json1:%@",json1);

NSDictionary *data1 = [json1 objectFromJSONString];
NSLog(@"json1.a:%@",[data1 objectForKey:@"a"]);
NSLog(@"json1.b:%@",[data1 objectForKey:@"b"]);

//如果json有嵌套,即value里有array、object,如果再使用objectFromJSONString,程式可能會報錯(測試結果表明:使用由網路或得到的php/json_encode生成的json時會報錯,但使用NSString定義的json字元串時,解析成功),最好使用objectFromJSONStringWithParseOptions:
NSString *json2 = @"{\"a\":123, \"b\":\"abc\", \"c\":[456, \"hello\"], \"d\":{\"name\":\"張三\", \"age\":\"32\"}}";
NSLog(@"json2:%@", json2);

NSDictionary *data2 = [json2 objectFromJSONStringWithParseOptions:JKParseOptionLooseUnicode];
NSLog(@"json2.c:%@", [data2 objectForKey:@"c"]);
NSLog(@"json2.d:%@", [data2 objectForKey:@"d"]);

 

 

友好提示:

4中解析方式的對比:

系統的API的解析速度最快。

SBJSON的解析速度為倒數第二差。

與系統API較為接近的是JSONKit。

在今後的開發過程中,建議選用系統的API或JSONKit來對JSON數據進行解析。

 

如果本文有任何錯誤之處,歡迎拍磚指正,與君共勉, 謝謝!

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 寫了一個slideDoor,reset.css就不放上來了,自行添加吧! 1 <!DOCTYPE html> 2 <html> 3 4 <head> 5 <meta charset="UTF-8"> 6 <title>slideDoor</title> 7 <link type="text/css"
  • 一,效果圖。 二,工程圖。 三,代碼。 RootViewController.m #import "RootViewController.h" @interface RootViewController () @end @implementation RootViewController - (id
  • 首先申明下,本文為筆者學習《OpenGL ES應用開發實踐指南(Android捲)》的筆記,涉及的代碼均出自原書,如有需要,請到原書指定源碼地址下載。 《OpenGL ES學習筆記(二)——平滑著色、自適應寬高及三維圖像生成》中闡述的平滑著色、自適應寬高是為了實現在移動端模擬真實場景採用的方法,並且...
  • 【原】AFNetworking源碼閱讀(五) 本文轉載請註明出處 —— polobymulberry-博客園 1. 前言 上一篇中提及到了Multipart Request的構建方法- [AFHTTPRequestSerializer multipartFormRequestWithMethod:U
  • 這一篇主要介紹使用AFN如何訪問HTTPS網站以及這些做法的實現原理,還有介紹AFN的網路狀態監測部分AFNetworkReachabilityManager,這個模塊會和蘋果官方發Reachability框架做一個對比。 本文所有的代碼都運行在iOS9.2的模擬器上,並且在info.plist對A
  • 本文節選自《Android Studio實用指南》 第4章第27節 作者: 畢小朋 目前本書已上傳到百度閱讀, 在百度中搜索[Anroid Studio實用指南]便可以找到本書. 什麼是演示模式? 顧名思義,當你想給別人演示你的代碼時就會用到這個演示模式. 演示模式的特點就是全屏,開啟免打擾模式,
  • <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_
  • 如圖是效果圖 我用的是SlidingMenu-master框架來實現的 左邊的是側滑界面是一個fragment,右邊是一個主界面fragment,在主界面中用的是一個ViewPager來進行切換,自定義個NoScrollViewPager(不能左右劃的ViewPager) 如下是主界面的代碼 pac
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...