數據解析

来源:http://www.cnblogs.com/xuan-yuan/archive/2016/04/28/5442239.html
-Advertisement-
Play Games

數據解析 1 數據傳輸過程 前端:請求(iOS/安卓(JAVA)PC(瀏覽器(HTML/CSS/JS))) :OC/JAVA/HTML/CSS/JS 後端:響應(伺服器開發:php/java/.net) 前端和後端交互的"數據格式": XML/JSON 數據解析. XML/"JSON" > OC 客 ...


數據解析

1 數據傳輸過程

前端:請求(iOS/安卓(JAVA)PC(瀏覽器(HTML/CSS/JS))) :OC/JAVA/HTML/CSS/JS

後端:響應(伺服器開發:php/java/.net)

前端和後端交互的"數據格式": XML/JSON

數據解析. XML/"JSON" ----> OC

   客戶端發送請求給伺服器,伺服器接收到客戶端的請求之後,返回給客戶端JSON數據.

   客戶端需要把伺服器返回的JSON數據轉換為OC的數據格式(數組/字典等).

2 數據解析 :JSON

JSON是一種輕量級的數據格式,一般用於數據交互,伺服器返回給客戶端的數據,一般都是JSON格式或者XML格式(文件下載除外),JSON是javascript語言的一個子集.javascript是個腳本語言(不需要編譯),用來給HTML增加動態功能.

註:  javascript和java沒有半毛錢的關係!

JSON的格式很像OC中的字典和數組  

NSJSONSerialization的常見方法

JSON數據 à OC對象

JSON – OC 轉換對照表

JSON

OC

大括弧 { }

NSDictionary

中括弧 [ ]

NSArray

雙引號 ” “

NSString

數字 10、10.8

NSNumber

 

3 解析數據的工具分類

  • JSON 解析的種類: SBJson, JSONKit, NSJSONSerialization
  • XML 解析的種類: DOM, SAX

4 JSON數據解析方法:

   在iOS中,常見的JSON數據解析方案有4種:

   第三方框架: SBJson ,JSONKit, TouchJson.性能從左到右,依次變差.

   蘋果原生(自帶):NSJSONSerialization (性能是最好的.iOS5以後推出).

5 解析JSON數據

   <1>反序列化(解析):

       將從伺服器接收到的JSON數據(二進位數據)轉換成OC數據類型(NSArray,NSDictionary等.)的過程.

   目的: JSON數據 --> OC對象; 得到數據字典或者數據數組

   好處: 簡化程式的開發,方便後續的字典轉模型.

   方法:

   +(id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)

opt error:(NSError **)error;

   <2>序列化:

       將數組或者字典發送給伺服器之前,轉換成二進位數據.

   目的:OC對象 --> JSON數據;得到二進位JSON數據 NSData;  

   好處:方便網路傳輸,提高傳輸速度.

   方法:

   +(NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;

   "需要註意的是,在做序列化之前,一定要檢測一下對象是否能夠被序列化."

   // 在做序列化之前,一定使用 isValidJSONObject 檢測一下要序列化的對象,是否能夠正確被序列化

   // 避免出現閃退! 

6.JSON標準化(會簡單的修改JSON數據)

具體思路:

> 發送網路請求

> 用字元串接收JSON數據

> 將JSON格式標準化

> 將標準化之後的JSON字元串轉換成二進位數據

> 將標準的JSON二進位數據轉化為OC數據

7. 學會將不標準的 JSON 數據解析出來!

> 先把jSON數據轉為字元串

> 利用字元串的方法,修改JSON數據

> 將標準化之後的json字元串轉換成二進位數據

> 將標準的JSON二進位數據轉換成 OC 數據

8 XML 全稱是Extensible Markup Language,譯作“可擴展標記語言

XML特征:

1、XML是一種標記語言,很類似HTML

2、XML的設計宗旨是傳輸數據,而非顯示數據

3、XML標簽沒有被預定義。您需要自行定義標簽。

4、XML被設計為具有自我描述性。

5、XML是W3C的推薦標準

     XML是獨立於軟體和硬體的信息傳輸工具。 目前,XML在Web中起到的作用不會亞於一直作為 Web 基石的 HTML。 XML無所不在。XML是各種應用程式之間進行數據傳輸的最常用的工具,並且在信息存儲和描述領域變得越來越流行。  

           XML常用的三種解析方式SAX/DOM/PULL。 

SAX是一個用於處理XML事件驅動的“推”模型,優點是一種解析速度快並且占用記憶體少的xml解析器,它需要哪些數據再載入和解析哪些內容。缺點是它不會記錄標簽的關係,而要讓你的應用程式自己處理,這樣就增加了你程式的負擔。

   DOM是一種文檔對象模型,DOM可以以一種獨立於平臺和語言的方式訪問和修改一個文檔的內容和結構。Dom技術使得用戶頁面可以動態地變化,如可以動態地顯示或隱藏一個元素,改變它們的屬性,增加一個元素等,Dom技術使得頁面的交互性大大地增強。缺點是DOM解析XML文件時,會將XML文件的所有內容以文檔樹方式存放在記憶體中。

Pull解析和Sax解析很相似,Pull解析和Sax解析不一樣的地方是pull讀取xml文件後觸發相應的事件調用方法返回的是數字還有pull可以在程式中控制想解析到哪裡就可以停止解析。 

 

SAX解析 :

NSXMLParserDelegate

// 1. 實例化 XML 的 SAX 解析器!

NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];         

// 2. 設置解析器代理.

delegate = self;            

// 3. 開始解析 XML 文檔

// 一旦調用了下麵的開始解析方法,就會自動調用代理方法,解析 XML 文檔!

 [parser parse];

 #pragma NSXMLParserDelegate

- (void)parserDidStartDocument:(NSXMLParser *)parser{

    NSLog(@"1.XML文檔解析開始!");

}

// 開始解析元素的時候就會調用!XML文檔中有多少個元素就會調用多個次!

// elementName:元素名稱!

// attributeDict:屬性字典!當前元素對應的屬性字典!

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName attributes:(NSDictionary<NSString *, NSString *> *)attributeDict

{

    NSLog(@"2.開始解析:%@元素,元素屬是:%@",elementName,attributeDict);  

  // 判斷:只有元素 vedio 的屬性字典是需要的內容!  

    if ([elementName isEqualToString:@"vedio"]) {    

        // 字典轉模型

        CZVideo *video = [CZVideo videoWithDict:attributeDict];

        // 添加到數據源中

        [self.videos addObject:video];

    }

}

// 發現元素內容的時候就會調用!

// string :元素內容!

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string

{

    NSLog(@"3.發現元素內容:%@",string);

}

 

// 元素解析結束的時候就會調用,XML文檔中有多少個元素就會調用多個次!

// elementName :元素名稱

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName

{

    NSLog(@"4.元素%@解析結束",elementName);

}

 

- (void)parserDidEndDocument:(NSXMLParser *)parser

{

    NSLog(@"5.XML文檔解析結束!");

}

DOM 解析

DOM解析的特點: 一次性載入文檔之後再解析.(需要導入靜態庫libxml2.tbd)

(1.獲得 DOM 對象 2.獲得根元素內容 3.遍歷根元素的"屬性數組"或者"子元素數組" 4.層層遍歷元素或者屬性內容... 5.根據節點的 name 屬性 和 stringValue 屬性獲得對應的值. 6. 給數據模型賦值)

// 1.獲得 DOM 對象!

GDataXMLDocument *dom = [[GDataXMLDocument alloc] initWithData:data options:0 error:NULL];

// 2.利用 dom 對象操縱 XML 節點!

// 利用 DOM 對象獲得需要的文檔內容!---> 根元素內容!

GDataXMLElement *rootElement = dom.rootElement;

// 3遍歷根元素的子元素,取出對應的子元素

[rootElement.children enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop)

//4.遍歷 元素的屬性數組,取出每一個屬性的值.

[vedioElement.attributes enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop)


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

-Advertisement-
Play Games
更多相關文章
  • 還不是很完全,目前只能點中間圖片才能位移,圖片外的其他區域沒有。。(屬性動畫),對了,圖片載入用得是facebook的一款android圖片載入庫,感覺非常NB啊,完爆一切。 1、先看佈局 2、主界面代碼 3、viewpager的適配器代碼 4、facebook的載入圖片的控制項 還不是很好,感興趣的 ...
  • HTTP原理 1 簡介 HTTP是一個屬於應用層的面向對象的協議,由於其簡捷、快速的方式,適用於分散式超媒體信息系統。 HTTP協議的主要特點可概括如下: 1.支持客戶/伺服器模式。 2.簡單快速:客戶向伺服器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規 ...
  • 通過/system/etc/media_codecs.xml可以確定當前設備支持哪些硬解碼。通過/system/etc/media_profiles.xml可以知道設備支持的具體profile和level等詳細信息。 ...
  • 一.封裝 1.封裝的概念: 封裝,顧名思義,就是把什麼封起來,裝起來.在程式開發中,封裝是優化代碼,提高代碼安全性的一種做法,即是將不必要暴露在外界的代碼,封裝在一個類中,在外界只調用他.如果看到這裡還沒有明白的話,那麼請往下看: 比如:你買了一個手機,你可以用手機打電話,發信息,上網等等各種操作, ...
  • 最近的一些個人小作品經常要用到一些控制開始或者暫停的圖片按鈕(類似音樂播放軟體控制音樂播放或暫停的按鈕),現放出來給大家分享下。 主要功能:點擊一次就更換為另一種狀態,再點擊一次就更換回原來的狀態。 首先,我們需要一個layout文件 control_button.xml 一個簡單的LinearLa ...
  • 在Android開發中,經常需要直接查看Android SDK的源碼來理解內部功能的實現,也可以藉助源碼來調試。要想實現這些,需要在SDK Manager中下載對應API級別的源碼,如下圖: 完成上面的步驟後,在AS裡面CTRL+左鍵點擊類或方法進入源碼時,AS卻提示沒有找到源碼,如下圖: 後來發現 ...
  • 在非UI線程里調用SDK的函數出現如下異常如何處理: ...
  • 聲明:源代碼不是我寫的,是網上的以為大神寫的(地址給忘了),我拿過來以後呢,稍微改動了一下源碼,使之符合了項目需求,再次特別感謝那位大牛,非常感謝。 是一個自定義佈局,繼承自ViewGroup 2、這個自定義佈局使用起來也非常的方便 還是代碼直接點 這裡面能放兩個Viewgroup,第二個Viewg ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...