Delphi用QJSON解析JSON格式的資料

來源:互聯網
上載者:User

標籤:des   style   blog   color   使用   資料   

本來用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);

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.