1)JSON字符串还原为结构体; 2)访问结构体的字段值; uses SynCommons; const // JSON字符串 JSON1 = '{' + #13#10 + '"glossary": {' + #13#10 + '"title": "中国",' + #13#10 + ' "GlossDiv": {' + #13#10 + '"title": "湖南省",' + #13#10 + ' "GlossList": {' + #13#10 + '"GlossEntry": {' + #13#10 + '"ID": "湘乡市",' + #13#10 + ' "SortAs": "SGML",' + #13#10 + ' "GlossTerm": "Standard Generalized Markup Language",' + #13#10 + ' "Acronym": "SGML",' + #13#10 + ' "Abbrev": "ISO 8879:1986",' + #13#10 + ' "GlossDef": {' + #13#10 + '"para": "A meta-markup language, used to create markup languages such as DocBook.",' + #13#10 + ' "GlossSeeAlso": ["咏南中间件", "XML"]' + #13#10 + '},' + #13#10 + ' "GlossSee": "markup"' + #13#10 + '}' + #13#10 + '}' + #13#10 + '}' + #13#10 + '}' + #13#10 + '}'; type // 记录 TGlossary = record glossary: record title: string; GlossDiv: record title: string; GlossList: record GlossEntry: record ID, SortAs, GlossTerm, Acronym, Abbrev: string; GlossDef: record para: string; GlossSeeAlso: array of string; end; GlossSee: string; end; end; end; end; end; procedure TForm1.Button1Click(Sender: TObject); var gloss: TGlossary; json: RawUTF8; begin json := JSON1; RecordLoadJSON(gloss, @json[1], TypeInfo(TGlossary)); Memo1.Clear; Memo1.Lines.Add(gloss.glossary.title); // 中国 Memo1.Lines.Add(gloss.glossary.GlossDiv.title); // 湖南省 Memo1.Lines.Add(gloss.glossary.GlossDiv.GlossList.GlossEntry.ID); // 湘乡市 Memo1.Lines.Add(gloss.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso[0]); // 咏南中间件 end; ### JSON还原为结构体 本篇文章主要探讨了如何将JSON字符串转换为Delphi中的记录(结构体),并进一步展示了如何访问这些记录中的字段值。在实际应用中,这种能力非常关键,尤其是在处理复杂的嵌套数据结构时。 #### JSON字符串还原为结构体 我们来看一下JSON字符串的构造: ```json { "glossary": { "title": "中国", "GlossDiv": { "title": "湖南省", "GlossList": { "GlossEntry": { "ID": "湘乡市", "SortAs": "SGML", "GlossTerm": "Standard Generalized Markup Language", "Acronym": "SGML", "Abbrev": "ISO 8879:1986", "GlossDef": { "para": "A meta-markup language, used to create markup languages such as DocBook.", "GlossSeeAlso": ["咏南中间件", "XML"] }, "GlossSee": "markup" } } } } } ``` 该JSON数据表示了一个包含多个层次的数据结构,其中`glossary`是顶层对象,包含了`title`、`GlossDiv`等属性。`GlossDiv`又包含了更详细的子对象,如`GlossList`,它包含了`GlossEntry`对象。`GlossEntry`则进一步包含了各种与词条相关的详细信息。 接下来定义了对应的Delphi记录类型: ```pascal type TGlossary = record glossary: record title: string; GlossDiv: record title: string; GlossList: record GlossEntry: record ID, SortAs, GlossTerm, Acronym, Abbrev: string; GlossDef: record para: string; GlossSeeAlso: array of string; end; GlossSee: string; end; end; end; end; end; ``` 此结构体定义了与JSON数据结构相对应的字段,确保每个字段都能正确映射到JSON中的相应键值对。 #### 将JSON转换为记录 为了将JSON字符串转换为记录,我们需要使用特定的方法或函数。在这个例子中,使用了`RecordLoadJSON`函数,该函数可以将JSON字符串加载到指定类型的记录中: ```pascal var json: RawUTF8; gloss: TGlossary; begin json := JSON1; RecordLoadJSON(gloss, @json[1], TypeInfo(TGlossary)); ``` 这里的关键是`RecordLoadJSON`函数,它负责解析JSON字符串,并填充到`TGlossary`记录中。`@json[1]`是为了跳过JSON字符串中的第一个字符(通常是左花括号 `{`),因为`RecordLoadJSON`期望的输入是从JSON对象的主体开始的。 #### 访问结构体的字段值 一旦JSON数据被成功转换为记录,就可以像操作普通的Delphi变量一样访问其字段值。例如: ```pascal Memo1.Clear; Memo1.Lines.Add(gloss.glossary.title); // 中国 Memo1.Lines.Add(gloss.glossary.GlossDiv.title); // 湖南省 Memo1.Lines.Add(gloss.glossary.GlossDiv.GlossList.GlossEntry.ID); // 湘乡市 Memo1.Lines.Add(gloss.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso[0]); // 咏南中间件 ``` 通过这种方式,可以方便地读取并显示JSON数据中的各个字段值。 总结而言,本文介绍了一个实用的例子,展示了如何使用Delphi将JSON字符串转换为结构体以及如何访问这些结构体中的字段值。这对于处理复杂的数据结构和实现数据交互具有重要意义。
uses
SynCommons;
const /// JSON字符串
JSON1 =
'{' + #13#10 + '"glossary": {' + #13#10 + '"title": "中国",' + #13#10
+ ' "GlossDiv": {' + #13#10
+ '"title": "湖南省",' + #13#10
+ ' "GlossList": {' + #13#10
+ '"GlossEntry": {' + #13#10
+ '"ID": "湘乡市",' + #13#10
+ ' "SortAs": "SGML",' + #13#10
+ ' "GlossTerm": "Standard Generalized Markup Language",' + #13#10
+ ' "Acronym": "SGML",' + #13#10
+ ' "Abbrev": "ISO 8879:1986",' + #13#10
+ ' "GlossDef": {' + #13#10
+ '"para": "A meta-markup language, used to create markup languages such as DocBook.",' + #13#10
+ ' "GlossSeeAlso": ["咏南中间件", "XML"]' + #13#10
+ '},' + #13#10
+ ' "GlossSee": "markup"' + #13#10 + '}'
+ #13#10 + '}' + #13#10
+ '}' + #13#10
+ '}' + #13#10
+ '}';
type // 记录
TGlossary = record
glossary: record
- 粉丝: 2
- 资源: 17
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助