久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    Delphi XE6 原生解析json

     A芝蘭之室 2017-10-29
                      Delphi XE5帶了system.json單元,原生提供了json支持類。下面是解析json用法說明:
    最簡單的JSON大致像這樣
    {
    
              "date":"周二(今天, 實時:12℃)",
    
              "dayPictureUrl":"http://api.map.baidu.com/images/weather/day/duoyun.png",
    
              "nightPictureUrl":"http://api.map.baidu.com/images/weather/night/duoyun.png",
    
              "weather":"多云",
    
              "wind":"北風微風",
    
              "temperature":"15 ~ 6℃"
    
            }
    
    對于這種格式比較簡單的json,解析是非常容易的
      StrJson := RESTResponse1.Content;
    
      JSONObject := TJSONObject.ParseJSONValue(TEncoding.UTF8.GetBytes(StrJson), 0) as TJSONObject;
    
    JSONObject.getValue('date');就可以得到date的值。如果像下面的這樣結構比較復雜的json,就需要首先分析清楚這個json的格式才能獲取成功。
    {
    
      "error":0,
    
      "status":"success",
    
      "date":"2014-03-04",
    
      "results":
    
      [{"currentCity":"成都",
    
           "weather_data":[
    
    {
    
              "date":"周二(今天, 實時:12℃)",
    
              "dayPictureUrl":"http://api.map.baidu.com/images/weather/day/duoyun.png",
    
              "nightPictureUrl":"http://api.map.baidu.com/images/weather/night/duoyun.png",
    
              "weather":"多云",
    
              "wind":"北風微風",
    
              "temperature":"15 ~ 6℃"
    
            },
    
            {
    
              "date":"周三",
    
              "dayPictureUrl":"http://api.map.baidu.com/images/weather/day/yin.png",
    
              "nightPictureUrl":"http://api.map.baidu.com/images/weather/night/xiaoyu.png",
    
              "weather":"陰轉小雨",
    
              "wind":"北風微風",
    
              "temperature":"14 ~ 7℃"
    
            },
    
            {
    
              "date":"周四",
    
              "dayPictureUrl":"http://api.map.baidu.com/images/weather/day/xiaoyu.png",
    
              "nightPictureUrl":"http://api.map.baidu.com/images/weather/night/xiaoyu.png",
    
              "weather":"小雨",
    
              "wind":"北風微風",
    
              "temperature":"12 ~ 7℃"
    
            },
    
            {
    
              "date":"周五",
    
              "dayPictureUrl":"http://api.map.baidu.com/images/weather/day/xiaoyu.png",
    
              "nightPictureUrl":"http://api.map.baidu.com/images/weather/night/xiaoyu.png",
    
              "weather":"小雨",
    
              "wind":"南風微風",
    
              "temperature":"9 ~ 6℃"
    
            }
    
          ]
    
        }
    
      ]}
    
    
    這是一個嵌套結構,最外層是一個記錄,包含"error","status","date","results"四個字段,前三個都是簡單的鍵值對,而“results”是一個數(shù)組,目前只有一個元素,即一條記錄,這條記錄的字段是"currentCity"和"weather_data",再進一步"weather_data"又是一個組數(shù),它有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 := 'xxxxxxx';//假定是上面那個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
    
          
    
    這段代碼只是為了說明使用方法,沒有做類型檢查,最好在進行類型轉換之前用is 
    TJSONArray先判斷是不是數(shù)組。
    原文地址
    補充,在原文中,作者沒有提到,如何檢查一個指定的串值是否存在,比如
    下面這行代碼:
    weather :=
    JSONObject.GetValue('weather_data');
    如果'weather_data'不存在,JSONObject.GetValue方法是要產(chǎn)生異常的,那么,該如何檢查weath_data是否存在呢?

    先聲明一個
    var
      jsonvalue: Tjsonvalue;
    然后,利用
    JSONObject.TryGetValue方法來檢查。
        ifjsonObject.TryGetValue('
    weather_data',jsonvalue) then
    ...
    如果weath_data存在,可以進一步通過jsonvalue.value取出其值。
    注意,這個jsonvalue不用建立與釋放。

    2014-11-19
    網(wǎng)友發(fā)現(xiàn)上文中可能遇到的json串碼問題,并給出了解決代碼,Delphi <wbr>XE6 <wbr>原生解析jsonDelphi <wbr>XE6 <wbr>原生解析json
    procedure TForm1.Button2Click(Sender: TObject);
    var
      LJsonArr   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
            :=Format('%s %s',[TJSONPair(LItem).JsonString.Value, TJSONPair(LItem).JsonValue.Value]);
       end;
    end;

      本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
      轉藏 分享 獻花(0

      0條評論

      發(fā)表

      請遵守用戶 評論公約

      類似文章 更多

      主站蜘蛛池模板: 香蕉EEWW99国产精选免费| 亚洲伊人五月丁香激情| 又爽又黄又无遮挡的激情视频| 2021亚洲国产精品无码| 亚洲人成网线在线播放VA| 亚洲电影天堂在线国语对白| 美女内射无套日韩免费播放| 宝贝扒开下面自慰给我看| 中文字幕日韩精品有码| 亚洲国产午夜精品福利| 老司机免费的精品视频| 国产综合久久亚洲综合| 女上男下激烈啪啪无遮挡| 天堂亚洲免费视频| 欧美激情一区二区久久久| 中文字幕日韩有码一区| 偷炮少妇宾馆半推半就激情| 美女又黄又免费的视频| 久久天天躁狠狠躁夜夜婷| 国产波霸爆乳一区二区| 中文字幕少妇人妻精品| 国产特级毛片AAAAAA视频| 国产精品大片中文字幕| 一个人免费视频WWW在线观看| 日韩系列精品无码免费不卡| 香蕉EEWW99国产精选免费| 狠狠色噜噜狠狠狠狠777米奇| 永久免费无码成人网站| 一区二区不卡国产精品| 国产又大又硬又粗| 无码人妻精品一区二区三区下载| 国产午夜福利精品视频| 亚洲中文久久久精品无码| 99九九视频高清在线| 国产稚嫩高中生呻吟激情在线视频| 亚洲日韩日本中文在线| 亚洲乱码一卡二卡卡3卡4卡| 中文字幕日韩人妻一区| 最新国产乱人伦偷精品免费网站| 欧美伦费免费全部午夜最新| 亚洲乱理伦片在线观看中字|