亚洲免费乱码视频,日韩 欧美 国产 动漫 一区,97在线观看免费视频播国产,中文字幕亚洲图片

      1. <legend id="ppnor"></legend>

      2. 
        
        <sup id="ppnor"><input id="ppnor"></input></sup>
        <s id="ppnor"></s>

        Delphi用QJSON解析JSON格式的數據

        字號:


            本來用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":"離開 [北京石景山營業(yè)廳] 派送中,遞送員
            [溫],電話[]"},
            {"time":"2012-07-06 19:46:38","context":"到達 [北京石景山營業(yè)廳]"},
            {"time":"2012-07-06 15:22:32","context":"離開 [北京石景山營業(yè)廳] 派送中,遞送員
            [溫],電話[]"},
            {"time":"2012-07-06 15:05:00","context":"到達 [北京石景山營業(yè)廳]"},
            {"time":"2012-07-06 13:37:52","context":"離開 [北京_同城中轉站] 發(fā)往 [北京石景山
            營業(yè)廳]"},
            {"time":"2012-07-06 12:54:41","context":"到達 [北京_同城中轉站]"},
            {"time":"2012-07-06 11:11:03","context":"離開 [北京運轉中心駐站班組] 發(fā)往 [北京_
            同城中轉站]"},
            {"time":"2012-07-06 10:43:21","context":"到達 [北京運轉中心駐站班組]"},
            {"time":"2012-07-05 21:18:53","context":"離開 [福建_廈門支公司] 發(fā)往 [北京運轉中
            心_航空]"},
            {"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","離開 [北京石景山營業(yè)廳] 派送中,遞送員[溫],電話[]",
            ]}
            可以看到數組里面的串不再是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);