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”是一个数组,目前只有一个元素,即一条记录,这条记录的字段是"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 := '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先判断是不是数组。
原文地址
补充,在原文中,作者没有提到,如何检查一个指定的串值是否存在,比如下面这行代码: weather := JSONObject.GetValue('weather_data'); 如果'weather_data'不存在,JSONObject.GetValue方法是要产生异常的,那么,该如何检查weath_data是否存在呢?
先声明一个 var   jsonvalue: Tjsonvalue; 然后,利用JSONObject.TryGetValue方法来检查。     if jsonObject.TryGetValue('weather_data', jsonvalue) then ... 如果weath_data存在,可以进一步通过jsonvalue.value取出其值。 注意,这个jsonvalue不用建立与释放。

Delphi XE6 原生解析json的更多相关文章

  1. Delphi用QJSON解析JSON格式的数据

    本来用superobject来解析JSON已经够用了,可惜这个东东不能在移动端使用,于是找到QJSON来处理. 这是一个国内高手写开源免费的东西,赞一个. 假入数据如下: {"message ...

  2. Delphi用QJSON解析JSON格式的数据 【转】

    本来用superobject来解析JSON已经够用了,可惜这个东东不能在移动端使用,于是找到QJSON来处理. 这是一个国内高手写开源免费的东西,赞一个. 假入数据如下: {"message ...

  3. IOS 原生解析JSON 问题

    服务器----WebService 返回的是JSON数据 IOS解析报错: Error Domain=NSCocoaErrorDomain Code=3840 "Unable to conv ...

  4. Android原生生成JSON与解析JSON

    JSON数据是一种轻量级的数据交换格式,在Android中通常应用于client与server交互之间的传输数据.像如今在网上有非常多解析JSON数据的jar包,可是归根究竟用的都是Android原生 ...

  5. Android JSON原生解析的几种思路,以号码归属地,笑话大全,天气预报为例演示

    Android JSON原生解析的几种思路,以号码归属地,笑话大全,天气预报为例演示 今天项目中要实现一个天气的预览,加载的信息很多,字段也很多,所以理清了一下思路,准备独立出来写一个总结,这样对大家 ...

  6. Delphi中使用ISuperObject解析Json数据

    Java.Php等语言中都有成熟的框架来解析Json数据,可以让我们使用很少的代码就把格式化好的json数据转换成程序可识别的对象或者属性,同时delphi中也有这样的组件来实现此功能,即Isuper ...

  7. DELPHI解析JSON格式化的日期

    DELPHI解析JSON格式化的日期 json返回的日期是 /Date(1560355200000)/ 这样的格式. 这个1560355200000,是指1970年以后的秒数. DELPHI如何解析这 ...

  8. json原生解析

    身为新手,在运用网络解析json数据的时候,发现先会用Gson等框架解析json,然后就懒起来学原生解析了,这下在看别人写的demo的时候就尴尬了,一块块的,不懂写什么,气氛十分尴尬. 不多说,先来条 ...

  9. [转]javascript eval函数解析json数据时为什加上圆括号eval("("+data+")")

    javascript eval函数解析json数据时为什么 加上圆括号?为什么要 eval这里要添加 “("("+data+")");//”呢?   原因在于: ...

随机推荐

  1. ACM-ICPC代码模板

    是不是感觉手中的模板都各有缺陷? 要找到好的模板就要集百家之所长, 我在这里贡献出我的代码模板丰富大家的积累. 我的模板能较好的与常见的模板形成互补. 赶快收藏吧,否则以后找不到就不好啦! 另外,想成 ...

  2. ffmpeg-20160822-bin.7z

    ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 5 屏幕横向放大 20 像素 6 屏幕横向缩小 20 像素 S 下一帧 [ -2秒 ] +2 ...

  3. Android之界面(布局文件layput)

    1.关于组件居中  ① android:layout_gravity="center" 控件在包含该控件的父控件中的位置.同样,当我们在Button按钮控件中设置android:l ...

  4. (2016弱校联盟十一专场10.3) A.Best Matched Pair

    题目链接 #include<cstdio> #include<cstring> #include<algorithm> #include<stack> ...

  5. java类读取properties文件

    package com.bshinfo.el.userInfo.util; import java.io.BufferedReader;import java.io.File;import java. ...

  6. C++ 基础知识复习(三)

    43. 继承的几种方式: 答:共有继承public,保护继承protected,私有继承private.其中后两种继承会改变原有的访问级别. 44. 深复制与浅复制: 答:简单理解,深复制自己申请了内 ...

  7. PHP操作数据库

    一.PHP连接到MySQL // //比较规范的写法是地址,登录名,密码这样写,比较安全 define("DB_HOST", 'localhost'); define('DB_US ...

  8. windows下修复Linux引导 and linux下几个常用软件

    在这里,我选择的是deepinLinux,不用说,高端大气上档次! Linux下引导修复 在win7上安装好了Linux,一不小心Linux系统启动不了 (一不小心的过程,想使用root登录图像界面, ...

  9. 几种服务器端IO模型的简单介绍及实现

    一些概念: 同步和异步 同步和异步是针对应用程序和内核的交互而言的,同步指的是用户进程触发I/O操作并等待或者轮询的去查看I/O操作是否就绪,而异步是指用户进程触发I/O操作以后便开始做自己的事情,而 ...

  10. 日期与时间戳相互转化(js)

    function datetime_to_unix(datetime){     var tmp_datetime = datetime.replace(/:/g,'-');     tmp_date ...