Delphi XE6 原生解析json

2021-09-25 19:35:33 字數 2783 閱讀 6909

delphi xe5帶了system.json單元,原生提供了json支援類。下面是解析json用法說明:

最簡單的json大致像這樣

對於這種格式比較簡單的json,解析是非常容易的

strjson := restresponse1.content;jsonobject := tjsonobject.parsejsonvalue(tencoding.utf8.getbytes(strjson), 0) as tjsonobject;
jsonobject.getvalue('date'); 就可以得到date的值。如果像下面的這樣結構比較複雜的json,就需要首先分析清楚這個json的格式才能獲取成功。

,,,

]}]}

這是乙個巢狀結構,最外層是乙個記錄,包含"error", "status", "date","results"四個字段,前三個都是簡單的鍵值對,而「results」是乙個陣列,目前只有乙個元素,即一條記錄,這條記錄的字段是"currentcity"和"weather_data",再進一步"weather_data"又是乙個組數,它有4個元素或者記錄,每條記錄裡包含"date", "daypictureurl","nightpictureurl", "weather","wind", "temperature"字段。

要想取出裡面的"weather_data",利用目前的dbxjson裡的tjsonobject是不能直接取出來的,例如這樣

strjson := restresponse1.content;

jsonobject := tjsonobject.parsejsonvalue(tencoding.utf8.getbytes(strjson), 0)

as tjsonobject;

weather := jsonobject.getvalue('weather_data');

需要一步一步的走,由於最外面是乙個簡單的json,可以先取出results,然後再取weather_data。

var

jsonobject: tjsonobject;

litem: tjsonvalue;

ljpair: tjsonpair;

weather: tjsonarray;

strjson: string;

result: string;

i: integer;

begin

strjson := '******x';//假定是上面那個json

jsonobject := tjsonobject.parsejsonvalue(tencoding.utf8.getbytes(strjson), 0)

as tjsonobject;

jsonobject := (jsonobject.getvalue('results') as tjsonarray).get(0)

as tjsonobject;

weather := jsonobject.getvalue('weather_data') as tjsonarray;

for i := 0 to weather.size - 1 do //應該是4條記錄

begin

litem := (weather.get(i) as tjsonobject).getvalue('weather'); //得到weather的值

result := result '|' litem.value;

end;

end

補充,在原文中,作者沒有提到,如何檢查乙個指定的串值是否存在,比如下面這行**:

weather := jsonobject.getvalue('weather_data');

如果'weather_data'不存在,jsonobject.getvalue方法是要產生異常的,那麼,該如何檢查weath_data是否存在呢?

先宣告乙個

varjsonvalue: tjsonvalue;

然後,利用jsonobject.trygetvalue方法來檢查。

if jsonobject.trygetvalue('weather_data', jsonvalue) then

...如果weath_data存在,可以進一步通過jsonvalue.value取出其值。

注意,這個jsonvalue不用建立與釋放。

2014-11-19

網友發現上文中可能遇到的json串碼問題,並給出了解決**,

procedure tform1.button2click(sender: tobject);

varljsonarr   : tjsonarray;

ljsonvalue : tjsonvalue;

litem     : tjsonvalue;

strjson,s :string;

begin

strjson := restresponse1.content;

ljsonarr    := tjsonobject.parsejsonvalue(tencoding.utf8.getbytes(strjson),0) as tjsonarray;

for ljsonvalue in ljsonarr do

begin

for litem in tjsonarray(ljsonvalue) do

s :=format('%s : %s',[tjsonpair(litem).jsonstring.value, tjsonpair(litem).jsonvalue.value]);

end;

end;

js原生offsetParent解析

offsetparent是個唯讀屬性,返回最近顯示指定位置的容器元素的引用。如果元素沒有指定位置,最近的元素或者根元素 標準模式下是html,怪異模式下是body 就是offsetparent。當元素的style.display none 時,offsetparent返回null。由於offsett...

js原生offsetParent解析

offsetparent是個僅僅讀屬性,返回近期顯示指定位置的容器元素的引用。假設元素沒有指定位置,近期的元素或者根元素 標準模式下是html,怪異模式下是body 就是offsetparent。當元素的style.display none 時。offsetparent返回null。因為offset...

原生JS第6周

前言 上週除了正常的專案進度,劍指offer 二叉樹 紅寶書進度 正則表達.先迴圈外面部分的,渲染,再獨自迴圈裡面的 迭代插入.具體如下 本次迴圈是把城市列表迴圈出來,屬性有首字母和城市名.原生js無時無刻不在體現它的強大.外迴圈部分 if newarr.length 0 var list docu...