Delphi XE6 原生解析json
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"字段。
StrJson := RESTResponse1.Content;
JSONObject := TJSONObject.ParseJSONValue(TEncoding.UTF8.GetBytes(StrJson), 0)
as TJSONObject; weather := JSONObject.GetValue('weather_data');
需要一步一步的走,由于最外面是一个简单的json,可以先取出results,然后再取weather_data。
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的更多相关文章
- Delphi用QJSON解析JSON格式的数据
本来用superobject来解析JSON已经够用了,可惜这个东东不能在移动端使用,于是找到QJSON来处理. 这是一个国内高手写开源免费的东西,赞一个. 假入数据如下: {"message ...
- Delphi用QJSON解析JSON格式的数据 【转】
本来用superobject来解析JSON已经够用了,可惜这个东东不能在移动端使用,于是找到QJSON来处理. 这是一个国内高手写开源免费的东西,赞一个. 假入数据如下: {"message ...
- IOS 原生解析JSON 问题
服务器----WebService 返回的是JSON数据 IOS解析报错: Error Domain=NSCocoaErrorDomain Code=3840 "Unable to conv ...
- Android原生生成JSON与解析JSON
JSON数据是一种轻量级的数据交换格式,在Android中通常应用于client与server交互之间的传输数据.像如今在网上有非常多解析JSON数据的jar包,可是归根究竟用的都是Android原生 ...
- Android JSON原生解析的几种思路,以号码归属地,笑话大全,天气预报为例演示
Android JSON原生解析的几种思路,以号码归属地,笑话大全,天气预报为例演示 今天项目中要实现一个天气的预览,加载的信息很多,字段也很多,所以理清了一下思路,准备独立出来写一个总结,这样对大家 ...
- Delphi中使用ISuperObject解析Json数据
Java.Php等语言中都有成熟的框架来解析Json数据,可以让我们使用很少的代码就把格式化好的json数据转换成程序可识别的对象或者属性,同时delphi中也有这样的组件来实现此功能,即Isuper ...
- DELPHI解析JSON格式化的日期
DELPHI解析JSON格式化的日期 json返回的日期是 /Date(1560355200000)/ 这样的格式. 这个1560355200000,是指1970年以后的秒数. DELPHI如何解析这 ...
- json原生解析
身为新手,在运用网络解析json数据的时候,发现先会用Gson等框架解析json,然后就懒起来学原生解析了,这下在看别人写的demo的时候就尴尬了,一块块的,不懂写什么,气氛十分尴尬. 不多说,先来条 ...
- [转]javascript eval函数解析json数据时为什加上圆括号eval("("+data+")")
javascript eval函数解析json数据时为什么 加上圆括号?为什么要 eval这里要添加 “("("+data+")");//”呢? 原因在于: ...
随机推荐
- PHP数组函数: array_walk()与 array_map() 的区别
详细的介绍如下: PHP数组函数: array_walk() PHP数组函数: array_map() 实际应用中的一点区别与总结: array_walk() 主要用于对某个数组的迭代,相当于 for ...
- PHP写文件函数
/** * 写文件函数 * * @param string $filename 文件名 * @param string $text 要写入的文本字符串 * @param string $openmod ...
- 支持向量机SVM
SVM(Support Vector Machine)有监督的机器学习方法,可以做分类也可以做回归.SVM把分类问题转化为寻找分类平面的问题,并通过最大化分类边界点距离分类平面的距离来实现分类. 有好 ...
- SpringMVC上传文件的三种方式
直接上代码吧,大伙一看便知 这时:commonsmultipartresolver 的源码,可以研究一下 http://www.verysource.com/code/2337329_1/common ...
- ubuntu下建立NFS共享,并用开发板挂载
安装NFS服务 apt-get install nfs-kernel-server nfs-common apt-get install portmap 在/etc/exports里加入 /home/ ...
- 密码备忘录(Android) 开发笔记
2015-10-28 功能: 1.注册[Ok],登陆[Ok],密码重置,找回密码 2.增加密码记录[ok],删除,修改,同步云 3.支持导入导出 代码仓库选择 BitBucket[change] 20 ...
- Caffe学习系列(17): caffe源码分析 vector<Blob<Dtype>*>& bottom(转)
转自:http://blog.csdn.net/qq_14975217/article/details/51524042 Blob:4个维度 n x c x h x w: bottom[0] .bot ...
- SQLite批量插入优化方法
SQLite的数据库本质上来讲就是一个磁盘上的文件,所以一切的数据库操作其实都会转化为对文件的操作,而频繁的文件操作将会是一个很好时的过程,会极大地影响数据库存取的速度. 例如:向数据库中插入10 ...
- virtualbox之usb设备的分配
来源:http://www.cnblogs.com/fsjohnhuang/p/3987545.html 首先下载安装virtualbox的扩展包,因为box原本不支持usb设备.www.virtua ...
- caffe下训练时遇到的一些问题汇总
1.报错:“db_lmdb.hpp:14] Check failed:mdb_status ==0(112 vs.0)磁盘空间不足.” 这问题是由于lmdb在windows下无法使用lmdb的库,所以 ...