程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi用QJSON解析JSON格式的數據

Delphi用QJSON解析JSON格式的數據

編輯:Delphi

本來用superobject來解析JSON已經夠用了,可惜這個東東不能在移動段使用,於是找到QJSON來處理。   這是一個國內高手寫開源免費的東西,贊一個。   加入數據如下:   復制代碼 {"message":"ok","status":"1","state":"3","data": [{"time":"2012-07-07 13:35:14","context":"客戶已簽收"},  {"time":"2012-07-07 09:10:10","context":"離開 [北京石景山營業廳] 派送中,遞送員 [溫],電話[]"},  {"time":"2012-07-06 19:46:38","context":"到達 [北京石景山營業廳]"},  {"time":"2012-07-06 15:22:32","context":"離開 [北京石景山營業廳] 派送中,遞送員 [溫],電話[]"},  {"time":"2012-07-06 15:05:00","context":"到達 [北京石景山營業廳]"},  {"time":"2012-07-06 13:37:52","context":"離開 [北京_同城中轉站] 發往 [北京石景山 營業廳]"},  {"time":"2012-07-06 12:54:41","context":"到達 [北京_同城中轉站]"},  {"time":"2012-07-06 11:11:03","context":"離開 [北京運轉中心駐站班組] 發往 [北京_ 同城中轉站]"},  {"time":"2012-07-06 10:43:21","context":"到達 [北京運轉中心駐站班組]"},  {"time":"2012-07-05 21:18:53","context":"離開 [福建_廈門支公司] 發往 [北京運轉中 心_航空]"},  {"time":"2012-07-05 20:07:27","context":"已取件,到達 [福建_廈門支公司]"} ]}  復制代碼 用QJSON解析如下:   復制代碼 procedure TForm15.Button1Click(Sender: TObject); var   aqjson,aqjsonarr : TQJSON;   i : Integer;   stime, scontext : string; begin   aqjson := TQJSON.Create;   aqjson.parse(memo1.lines.text);   if aqjson.ValueByName('message', '') = 'ok' then   begin     memo2.Clear;     aqjsonarr := aqjson.ItemByName('data');     for i := 0 to aqjsonarr.Count - 1 do     begin       stime := aqjsonarr.Items[i].ValueByName('time', '');       scontext := aqjsonarr.Items[i].ValueByName('context', '');         Memo2.Lines.Add(stime+'----'+scontext);     end;   end; end; 復制代碼 可以看到QJSON的解析還是很方便的。   不過這種格式存在大量冗余數據——每個數據項都攜帶了字段信息,其實可以只返回一次字段信息即可。   數據精簡如下:   {"message":"ok","status":"1","state":"3","data": ["2012-07-07 13:35:14","客戶已簽收",  "2012-07-07 09:10:10","離開 [北京石景山營業廳] 派送中,遞送員[溫],電話[]", ]}  可以看到數組裡面的串不再是JSON格式(Key:Value)的了,這時不能再使用ValueByName,而直接使用Value。   復制代碼 procedure TForm15.Button2Click(Sender: TObject); var   aqjson,aqjsonarr : TQJSON;   i : Integer;   stime, scontext : string; begin   aqjson := TQJSON.Create;   aqjson.parse(memo3.lines.text);   if aqjson.ValueByName('message', '') = 'ok' then   begin     memo2.Clear;     aqjsonarr := aqjson.ItemByName('data');     for i := 0 to aqjsonarr.Count - 1 do     begin       stime := aqjsonarr.Items[i].ValueByName('time', '');       scontext := aqjsonarr.Items[i].ToString;         Memo2.Lines.Add(stime+'----'+scontext);     end;   end; end; 復制代碼 實際編碼中,會存在返回圖片到客戶端的情況,如果也采用JSON格式傳輸的話,需要把圖片轉成Base64格式的傳包裝,然後再傳輸到客戶端解析。   這裡是一個演示,首先把圖片轉成流:   Image1.Picture.Graphic.SaveToStream(ss); 然後編碼成base64格式的:   EncodeStream(ss, ss1); 注意ss和ss1的定義:   var   ss: TMemoryStream;   ss1,ss2 : TStringStream; EncodeStream的調用需要引用EncdDecd.pas單元。   然後把流轉成字符串 復制代碼 var   sdata : string; begin ...   sData := ss1.DataString; ... end; 復制代碼 再把該字符串包裝到JSON串:   復制代碼 var   aqjson : TQJSON; begin   aqjson := TQJSON.Create;   aqjson.Parse(memo3.Lines.Text); ...   aqjson.AddArray('pic').Add.AsString :=sdata; ... end; 復制代碼 這樣圖片就打包到JSON裡面了,傳到客戶端以後,再反過來解析即可:   ss2 := TStringStream.Create(aqjson.ItemByName('pic').Items[0].value); DecodeStream(ss2,ss);//將base64字符流還原為內存流 ss.Position := 0; // 必須 Image2.Picture.Graphic.LoadFromStream(ss);

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved