一、Demo一 解析嵌套数组
Json数据
{"code":1,"msg":"","data":{"GradeInfo":[{"gradeid":1,"gradename":"普通介绍人","graderate":0.02}],"UserList":[{"stype":"User","userid":"119110"},{"stype":"User","userid":"11911044"},{"stype":"User","userid":"119110444"},{"stype":"User","userid":"121121"},
{"stype":"User","userid":"13211111113"},{"stype":"User","userid":"abcadsfa"},{"stype":"Customer","userid":"admin"},{"stype":"Shoper","userid":"Shop2222"}]}}
var
Jsobj:TJSONObject;
i,j:Integer;
Jarr:TJSONArray;
temp:string;
v:string;
Jsvalue:Tjsonvalue ; begin Jsobj:=TJSONObject.ParseJSONValue(Memo1.Text) as TJSONObject;
temp:=Jsobj.GetValue('data').ToString;
Jsobj:=TJSONObject.ParseJSONValue(temp) as TJSONObject; jarr := TJSONArray(Jsobj.GetValue('UserList'));
for i := to Jarr.Size- do
begin
v:=(Jarr.Items[i].ToString);
Jsobj:=TJSONObject.ParseJSONValue(v) as TJSONObject;
// for j := 0 to Jsobj.Count do
// begin
ShowMessage(Jsobj.GetValue('userid').ToString);
//end;
end;
end;
二 Demo二
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), ) 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), )
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), )
as TJSONObject;
JSONObject := (JSONObject.GetValue('results') as TJSONArray).Get()
as TJSONObject;
weather := JSONObject.GetValue('weather_data') as TJSONArray; for i := to weather.size - 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不用建立与释放。 --
网友发现上文中可能遇到的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),) 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; 三、Demo三
{
功能:DelphiXE7中使用JSON
------------------------------------------------------------------------------
说明:
1,使用Delphi自己带的JSON(system.json)。
2,这仅仅是一个简单例子,以后还会增加演示功能。
------------------------------------------------------------------------------
注意:
1,JSON类创建后,里面所有元素不用管释放,JSON类自己管理,千万不要画蛇添足啊!!!!!!
------------------------------------------------------------------------------
作者:孙玉良 QQ:14667479 Email:sunylat@163.com 修改时间:2014/11/23 00:13
------------------------------------------------------------------------------
开发工具:Delphi XE7
测试手机:华为荣耀X1
}
unit Unit1; interface uses
System.SysUtils, System.Types, System.UITypes, System.Classes,
System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
FMX.Layouts, FMX.Memo; type
TForm1 = class(TForm)
Panel1: TPanel;
Memo1: TMemo;
Panel2: TPanel;
Button1: TButton;
Button2: TButton;
Memo2: TMemo;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure FormResize(Sender: TObject);
private
{ Private declarations } // 重新设置button按钮
procedure ResetButton;
public
{ Public declarations }
end; var
Form1: TForm1; const
// 演示用的JSON
jsonString = '{"name":"张三", "other":["中国","程序员"]}'; implementation {$R *.fmx} uses
System.json; // Dephi自带的JSON单元 procedure TForm1.Button1Click(Sender: TObject);
var
JSONObject: TJSONObject; // JSON类
i: Integer; // 循环变量
temp: string; // 临时使用变量
jsonArray: TJSONArray; // JSON数组变量
begin if Trim(Memo1.Text) = '' then
begin
ShowMessage('要解析数据不能为空!');
end
else
begin
JSONObject := nil;
try
{ 从字符串生成JSON }
JSONObject := TJSONObject.ParseJSONValue(Trim(Memo1.Text)) as TJSONObject; if JSONObject.Count > then
begin { 1,遍历JSON数据 }
Memo2.Lines.Add('遍历JSON数据:' + ##); Memo2.Lines.Add('JSON数据数量:' + IntToStr(JSONObject.Count)); for i := to JSONObject.Count - do
begin if i = then
begin
temp := JSONObject.Get(i).ToString + ##;;
end
else
begin
temp := temp + JSONObject.Get(i).ToString + ##;
end; end; { output the JSON to console as String }
Memo2.Lines.Add(temp); Memo2.Lines.Add('------------------------------'); { 2,按元素解析JSON数据 }
Memo2.Lines.Add('按元素解析JSON数据:' + ##);
temp := 'name = ' + JSONObject.Values['name'].ToString + ##;
Memo2.Lines.Add(temp); // json数组
jsonArray := TJSONArray(JSONObject.GetValue('other'));;
if jsonArray.Count > then
begin // 得到JSON数组字符串
temp := 'other = ' + JSONObject.GetValue('other').ToString + ##; // 循环取得JSON数组中每个元素
for i := to jsonArray.Size - do
begin
temp := temp + IntToStr(i + ) + ' : ' + jsonArray.Items[i]
.Value + ##;
end; end; Memo2.Lines.Add(temp); end
else
begin
temp := '没有数据!';
Memo2.Lines.Add(temp);
end; finally
JSONObject.Free;
end;
end; end; // 清空显示数据
procedure TForm1.Button2Click(Sender: TObject);
begin
Memo1.Text := '';
Memo2.Text := '';
end; // 设置要解析的JSON数据
procedure TForm1.Button3Click(Sender: TObject);
begin
Memo1.Text := jsonString;
end; // 设置要解析的JSON数据
procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.Text := jsonString;
end; procedure TForm1.FormResize(Sender: TObject);
begin
// 重新设置button按钮
self.ResetButton;
end; // 重新设置button按钮
procedure TForm1.ResetButton;
var
buttonWidth: Integer;
begin
buttonWidth := self.Width div ; Button1.Width := buttonWidth;
Button2.Width := buttonWidth;
Button3.Width := buttonWidth;
end; end.

Xe7 System.Json解析数据格式的更多相关文章

  1. Json解析数据

    Json数据解析(重点网址推荐:www.json.org   code.google.com/   https://www.json.com/) 1:什么是Json? 2:Json数据格式的特点? 3 ...

  2. Android数据解析-JSON解析

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,基于JavaScript(Standard ECMA-262 3rd Edition - December ...

  3. json解析之jackson

    对于json格式的数据解析现在越来越多了,之前介绍了两种:fastjson和net.sf.json解析. 今天又有一个jackson解析.不过相对于之前两种,这种感觉稍微笨拙些.呵呵,还是了解下吧: ...

  4. Java:JSON解析工具-org.json

    一.简介 org.json是Java常用的Json解析工具,主要提供JSONObject和JSONArray类,现在就各个类的使用解释如下. 二.准备 1.在使用org.json之前,我们应该先从该网 ...

  5. GeoJson的生成与解析,JSON解析,Java读写geojson,geotools读取shp文件,Geotools中Geometry对象与GeoJson的相互转换

    GeoJson的生成与解析 一.wkt格式的geometry转成json格式 二.json格式转wkt格式 三.json格式的数据进行解析 四.Java读写geojson 五.geotools读取sh ...

  6. System.Json 使用注意

    在xamarin中对json字符串进行解析,使用System.Json时出现怪问题: json-string = { "ret" : "OK" } 使用如下代码 ...

  7. Json解析工具的选择

    前言 前段时间@寒江不钓同学针对国内Top500和Google Play Top200 Android应用做了全面的分析(具体分析报告见文末的参考资料),其中有涉及到对主流应用使用json框架Gson ...

  8. Android总结之json解析(FastJson Gson 对比)

    前言: 最近为了统一项目中使用的框架,发现项目中用到了两种json解析框架,他们就是当今非常主流的json解析框架:google的Gson 和阿里巴巴的FastJson,为了废除其中一个所以来个性能和 ...

  9. Json解析工具Jackson(使用注解)

    原文http://blog.csdn.net/nomousewch/article/details/8955796 接上一篇文章Json解析工具Jackson(简单应用),jackson在实际应用中给 ...

随机推荐

  1. 学习笔记之Python调试 - pdb

    python调试神器——pdb - 软谋python https://mp.weixin.qq.com/s/w3Xw8I_zh7MFq2dx5kdQXw 优秀开发者必备技能包:Python调试器 - ...

  2. 学习笔记之WinSCP

    WinSCP :: Official Site :: Free SFTP and FTP client for Windows https://winscp.net/eng/index.php Win ...

  3. MySQL 二进制文件恢复数据基础版本

    先来一段 自行体会 #---------------------------------------------------------------------------------- #模拟通过b ...

  4. [UE4]更新Flag坐标

    UserWidget中也是有Event Tick事件,游戏运行每一帧都会调用这个事件 一.在MiniMapFlagData结构体中,添加Slot和ImageWidget变量 二.在StaticMini ...

  5. ACCESS常用数字类型的说明和取值范围

    下面是ACCESS常用数字类型的说明和取值范围列表明供参考 数字类型                 范围 Byte(字节)            介于 0 到 255 之间的整型数. Integer ...

  6. [VS工具]远程在IIS附加调试代码

    1.首先在服务器以管理员的方式打开msvsmon.exe(一般这个文件路径:C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\ID ...

  7. CentOS之文档的压缩与打包

    .rar压缩文件linux中不识别,.zip在windows和Linux中动能使用. .gz:由gzip压缩工具压缩的文件 .bz2:bzip2压缩工具压缩的文件 .tar:由tar打包程序打包的文件 ...

  8. (转)C#.NET WINFORM应用程序中控制应用程序只启动一次

    原文地址 :http://www.cnblogs.com/emanlee/archive/2009/08/31/1557379.html using System; using System.Thre ...

  9. sqoop导入导出

    sqoop产生背景 什么是sqoop sqoop的优势 sqoop1与sqoop2的比较 为什么选择sqoop1 sqoop在hadoop生态体系中的位置 sqoop基本架构 sqoop import ...

  10. Java - 17 Java 流(Stream)、文件(File)和IO

    Java 流(Stream).文件(File)和IO Java.io包几乎包含了所有操作输入.输出需要的类.所有这些流类代表了输入源和输出目标. Java.io包中的流支持很多种格式,比如:基本类型. ...