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"字段。

要想取出里面的"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不用建立与释放。

时间: 2024-08-04 11:14:41

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

Delphi用QJSON解析JSON格式的数据

本来用superobject来解析JSON已经够用了,可惜这个东东不能在移动段使用,于是找到QJSON来处理. 这是一个国内高手写开源免费的东西,赞一个. 加入数据如下: {"message":"ok","status":"1","state":"3","data": [{"time":"2012-07-07 13:35:14"

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

本来用superobject来解析JSON已经够用了,可惜这个东东不能在移动端使用,于是找到QJSON来处理. 这是一个国内高手写开源免费的东西,赞一个. 假入数据如下: {"message":"ok","status":"1","state":"3","data":[{"time":"2012-07-07 13:35:14",

IOS 原生解析JSON 问题

服务器----WebService 返回的是JSON数据 IOS解析报错: Error Domain=NSCocoaErrorDomain Code=3840 "Unable to convert data to string around character 56." UserInfo={NSDebugDescription=Unable to convert data to string around character 56.} Code = 3840 错误 通过我将JSON写成

Android原生生成JSON与解析JSON

JSON数据是一种轻量级的数据交换格式,在Android中通常应用于客户端与服务器交互之间的数据传输.像现在在网上有很多解析JSON数据的jar包,但是归根到底用的都是Android原生解析JSON数据的方式,所以掌握Android原生解析JSON数据的方法相当重要. 下面分为生成JSON数据和解析JSON数据,所用的包是org.json (1)生成JSON数据方法: 比如要生成一个这样的json文本 { "phone" : ["12345678", "8

IOS开发使用NSJSONSerialization、JSONKit、SBJson、TouchJson四种方式解析Json数据

概括:JSON数据解析可以使用苹果自带的NSJSONSerialization方式,也可以使用第三方框架,比如JSONKit.SBJson.TouchJSON等,框架的使用方式比较简单,但性能比ios原生方式差很多,建议使用原生方式. 1 NSJSONSerialization,IOS原生 /** *  解析JSON数据 */ -(void) analysisJSON{ // 获取URL NSURL *url = [[NSURL alloc] initWithString:@"http://lo

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

Android JSON原生解析的几种思路,以天气预报为例 今天项目中要实现一个天气的预览,加载的信息很多,字段也很多,所以理清了一下思路,准备独立出来写一个总结,这样对大家还是很有帮助的,老司机要开车了 涉及到网络,你就一定要先添加权限,准没错 <!--网络权限--> <uses-permission android:name="android.permission.INTERNET" /> 一.归属地查询(JSONObject) 这个也是最简单的一类Json

delphi xe6 调用java原生GPS的方法

如果用xe6自带的LocationSensor控件,默认优先使用网络位置,为了直接使用GPS位置,在网上搜到了以下代码,经实测证实是可用的. uses Androidapi.JNI.Location, Androidapi.JNIBridge, Androidapi.JNI.JavaTypes, Androidapi.JNI.Os,FMX.Helpers.Android,Androidapi.JNI.GraphicsContentViewText; type TLocationListener

json原生解析

身为新手,在运用网络解析json数据的时候,发现先会用Gson等框架解析json,然后就懒起来学原生解析了,这下在看别人写的demo的时候就尴尬了,一块块的,不懂写什么,气氛十分尴尬. 不多说,先来条好bolg的链接:http://blog.csdn.net/android_lyp/article/details/52072822 JSON对数据的描述形式,既然是形式,那么它的数据形式是什么样的: 对象的描述是: {} 数组的描述是: [] 属性或值的描述是: "" 连接之间的描述是:

xe5 delphi 解析 json

xe5 delphi 解析 json 2014-03-04 17:35:41|  分类: mobile |  标签:delphi  json  mobile  |举报 |字号大中小 订阅 最简单的JSON大致像这样 { "date":"周二(今天, 实时:12℃)", "dayPictureUrl":"http://api.map.baidu.com/images/weather/day/duoyun.png", "