Delphi原生JSON框架(二)TJsonArray
前面写了如何快速读取一个JSON串,但只是针对简单的类型,如果JSON串中有数组该怎么办呢?
一、例子代码
先看下面的代码,读取一个学生的各科成绩。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | procedure TForm6 . Button1Click(Sender: TObject); var jsonstr: string ; jv:TJSONValue; js:TJSONString; ja:TJSONArray; jo:TJSONObject; I: Integer ; begin jsonstr:= '{' + ' "person": {' + ' "sex": "男",' + ' "name": "王小二",' + ' "score": [{' + ' "语文": 120' + ' },' + ' {' + ' "数学": 89' + ' },' + ' {' + ' "英语": 100' + ' }' + ' ]' + ' }' + '}' ; jv := TJSONValue . ParseJSONValue(jsonstr); //将JSON串转换为JSON对象,即TJSONValue对象 if jv <> nil then begin Log( '姓名:' + jv . GetValue<TJSONValue>( 'person.name' ).Value); //直接读取节点值 Log( '性别:' + jv . GetValue<TJSONValue>( 'person.sex' ).Value); Log( '成绩' ); if jv . TryGetValue<TJSONArray>( 'person.score' , ja) then //读取JSON对象中的数组对象 begin for I := 0 to ja . Count - 1 do //循环数组对象 begin jo := ja . A[I] as TJSONObject; //取数组元素对象 var pair:= jo . Pairs[ 0 ]; //取出Pair对象 var s1 := pair . JsonString . value; //读取Pair中键名 var s2 := pair . JsonValue . Value; //读取Pair中值 //var s2:=jo.Values[s1].Value; //也可以根据Pair的键名读取键值 Log(s1 + '=' + s2); end ; end ; Log(jv . ToString); //输出:{"person":{"sex":"男","name":"王小二","score":[{"语文":120},{"数学":89},{"英语":100}]}} log(jv . ToJSON); //输出:{"person":{"sex":"\u7537","name":"\u738B\u5C0F\u4E8C","score":[{"\u8BED\u6587":120},{"\u6570\u5B66":89},{"\u82F1\u8BED":100}]}} end ; end ; |
运行后输出的结果:
二、代码解读
通过上面代码,重点在于如何解读JSON中的数组对象TJSONArray。
TJSONArray都是从TJSONValue继承而来,所以我们可以象正常一样,用TryGetValue方法从TJSONValue中读取一个TJSONArray对象。得到了TJSONArray对象,有两种方法取到每个元素值:
- TJSONArray.A[X]
- TJSONArray.Items[X]
这两种方式,都返回TJSONValue类型的对象。
循环一个TJSONArray,用到了TJSONArray.Count,即数据的长度,也可以用Size,但官方已经明确用Count取代了。从上面的代码中摘录出来:
1 2 3 4 5 6 7 8 9 | if jv . TryGetValue<TJSONArray>( 'person.score' , ja) then //读取JSON对象中的数组对象 begin for I := 0 to ja . Count - 1 do //循环数组对象 begin jo := ja . A[I] as TJSONObject; //取数组元素对象 //jo := ja.Items[I] as TJSONObject;//取数组元素对象的另一种写法 //... end ; end ; |
循环一个TJSONArray的另一种写法,这种写法更简洁:
1 2 3 4 5 6 7 8 9 | if jv . TryGetValue<TJSONArray>( 'person.score' , ja) then //读取JSON对象中的数组对象 begin var jva:TJSONValue; for jva in ja do begin jo :=jva as TJSONObject; //... end ; end ; |
我们可以快速读取一个数组的JSON串了,直接上代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | procedure TForm6 . Button2Click(Sender: TObject); begin var jsonstr:= '{' + ' "code": 0,' + ' "msg": "Success",' + ' "check": true,' + ' "datas": [{' + ' "id": 1,' + ' "name": "测试1",' + ' "age": 10' + ' },' + ' {' + ' "id": 2,' + ' "name": "测试2",' + ' "age": 10' + ' },' + ' {' + ' "id": 3,' + ' "name": "测试3",' + ' "age": 10' + ' },' + ' {' + ' "id": 4,' + ' "name": "测试4",' + ' "age": 10' + ' },' + ' {' + ' "id": 5,' + ' "name": "测试5",' + ' "age": 10' + ' }' + ' ],' + ' "time": "2020-12-03 11:19:08"' + '}' ; var jv := TJSONValue . ParseJSONValue(jsonstr); Log( 'code=' + jv . GetValue<TJSONValue>( 'code' ).Value); Log( 'msg=' + jv . GetValue<TJSONValue>( 'msg' ).Value); Log( 'check=' + jv . GetValue<TJSONBool>( 'check' ).Value); Log( 'time=' + jv . GetValue<TJSONValue>( 'time' ).Value); var ja := jv . GetValue<TJSONArray>( 'datas' ); var jva: TJSONValue; for jva in ja do begin Log( 'id=' + jva . GetValue<TJSONValue>( 'id' ).Value); Log( 'name=' + jva . GetValue<TJSONValue>( 'name' ).Value); Log( 'age=' + jva . GetValue<TJSONValue>( 'age' ).Value); end ; end ; |
输出结果:
通过上面的代码,其核心是基于TJSONValue及TJSONArray对象,就解析了这个JSON串!!
如果我们将jva转换成一个TJSONObject对象,那么基于TJSONObject对象的GetValue方法,可以改写这样:
1 2 3 4 5 6 7 8 9 | var ja := jv . GetValue<TJSONArray>( 'datas' ); var jva: TJSONValue; for jva in ja do begin var jo:=jva as TJSONObject; Log( 'id=' + jo . GetValue( 'id' ).Value); Log( 'name=' + jo . GetValue( 'name' ).Value); Log( 'age=' + jo . GetValue( 'age' ).Value); end ; |
标签:
delphi
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!