把别人发来的 JSON 解析为 Delphi 的对象

Delphi 的 SuperObject 解析和编码 Json 字符串的示例 在 Delphi 中,是一个流行的 JSON 解析和生成库。它允许你轻松地处理 JSON 数据,包括解析 JSON 字符串为可操作的对象,以及将对象编码回 JSON 字符串。以下是一个使用进行 JSON 解析和编码的示例:首先,确保你已经将的源代码添加到你的项目中,或者作为库引用。 阅读详情

需求

这个 JSON 是其它语言生成的,在 Delphi 程序里面,如果能把它变成对象,后继的代码就会更简单。

数据

{"pkt_type":"scan_report","gw_addr":"c7ef72a011b6","time":"2024-07-20 18:49:33","data":{"flags":5,"pkt_sn":2299,"report_type":"le5_raw","pkt_total":1,"pkt_index":0,"dev_total":1,"dev_num":1,"dev_infos":[{"addr":"e91440214207","rssi":-59,"time":"2024-07-20 18:49:33","name":"C2","adv_raw":"02010617FF000100251505AA00A26C0400410A4101EA0D9400640003094332"}]}}

解决方法

如何根据这个 JSON 字符串,构造 Delphi 的类?靠人眼去读 JSON 然后手写代码,比较累。尤其是里面有很多嵌套。

把这段 JSON 代码丢给 ChatGPT,让它写出对应的 Delphi 类。确实写出来了,但运行结果有问题。

反复和 ChatGPT 拉扯几次后,虽然它每次的回答都不全对,但是,在它东拉西扯的回答里面,逐步发现一些东西,反复做实验,由此增加了对 Delphi 处理 JSON 的了解。

先给出可以运行的代码:

interface

uses
  System.SysUtils,
  System.Classes,
  System.JSON,
  System.Generics.Collections,
  REST.Json.Types,
  REST.Json;



type
  TDevInfo = class
  private
    FAddr: string;
    FRssi: Integer;
    FTime: string;
    FName: string;

    [JSONName('adv_raw')]
    FAdvRaw: string;
  public
    property Addr: string read FAddr write FAddr;
    property Rssi: Integer read FRssi write FRssi;
    property Time: string read FTime write FTime;
    property Name: string read FName write FName;
    property adv_raw: string read FAdvRaw write FAdvRaw;
  end;

  TDevInfos = TArray<TDevInfo>; // array of TDevInfo;

  TData = class
  private
    FFlags: Integer;
    FPktSn: Integer;
    FReportType: string;
    FPktTotal: Integer;
    FPktIndex: Integer;
    FDevTotal: Integer;
    FDevNum: Integer;

    [JSONName('dev_infos')]
    FDevInfos: TDevInfos; //TObjectList<TDevInfo>;
  public
    constructor Create;
    destructor Destroy; override;
    property Flags: Integer read FFlags write FFlags;
    property pkt_sn: Integer read FPktSn write FPktSn;
    property report_type: string read FReportType write FReportType;
    property pkt_total: Integer read FPktTotal write FPktTotal;
    property pkt_index: Integer read FPktIndex write FPktIndex;
    property dev_total: Integer read FDevTotal write FDevTotal;
    property dev_num: Integer read FDevNum write FDevNum;
    property dev_infos: TDevInfos read FDevInfos write FDevInfos;
  end;

  TScanReport = class
  private
    [JSONName('pkt_type')]
    FPktType: string;
    FGwAddr: string;
    FTime: string;
    FData: TData;
  public
    constructor Create;
    destructor Destroy; override;

    class function ParseJSON(const JSONStr: string): TScanReport;

    property PktType: string read FPktType write FPktType;
    property gw_addr: string read FGwAddr write FGwAddr;
    property Time: string read FTime write FTime;
    property Data: TData read FData write FData;
  end;

implementation

{ TScanReport }

constructor TScanReport.Create;
begin
  FData := TData.Create;
end;

destructor TScanReport.Destroy;
begin
  FData.Free;
  inherited;
end;

class function TScanReport.ParseJSON(const JSONStr: string): TScanReport;
begin
  Result := TJson.JsonToObject<TScanReport>(JSONStr);
end;

{ TData }

constructor TData.Create;
begin
  //FDevInfos := TObjectList<TDevInfo>.Create;
end;

destructor TData.Destroy;
begin
  //FDevInfos.Free;
  inherited;
end;

end.

代码的解释和注意事项

1. 一开始 ChatGPT 把 JSON 里面的数组,定义为 TObjectList<T>。但这样做是错误的。错误现象是从 JSON 获得对象没问题,但对象里面的 ObjectList 里面没有内容,其 Count 为 0;这里,必须使用 TArray<> 数组类型,而不能使用 TObjectList<> 来对应 JSON 里面的数组;

2. 解析出来的对象,发现某些字段有值,某些字段没有值。因为 ChatGPT 给出来的代码,属性的名称并没有和 JSON 字符串里面的名称完全一致,所以把字段的属性名称改为和 JSON 字符串里面的名称完全一致(大小写都一样),也不行。最终发现,给每个字段加上类似:[JSONName('dev_infos')] 这样的属性定义,该字段对应的值就有了。

[JSONName('dev_infos')] 这样的属性定义放在类的私有字段定义里面,这个是我这个老程序员不知道的新语法。通过 ChatGPT 学到的。

到此,问题解决。

结论

目前的 ChatGPT 可以帮我们生成 Delphi 代码,节约了手写代码的繁琐。但是,它给出来的代码还是有问题的。之前测试过让它写 Python 代码,写出来的代码运行完全正确。看起来还是 Delphi 不如 Python 热度高,训练永的代码数据比 Python 开源代码少导致。

无论如何,虽然 ChatGPT 写的代码有问题,但仍然提供了思路,在它的代码基础上做一些修改,仍然可以获得能用的代码。

Delphi JSON总结(一) Delphi 解析JSON的方法,就我已知的,有三种: 1. Qjson 2. SuperObject 3. System.JSON (Delphi XE 自带) 为方便看效果, 使用Delphi 2007演示Qjson和SuperObject的使用,使用Delphi XE 10.1Berlin演示System.JSON的使用。 1. Delphi 2007使用Qjson(uses Qjson)和SuperObjec(uses superob... 阅读详情

相关推荐

Json数据处理技巧

此时的strAppId就是带双引号的:"HP8300_DEV",用的时候需要进行。后来发现另一种写法,可以不用replace,直接得出结果,但是其实也挺麻烦的。"module_name": "农业大棚","content": "农业大棚",此时的strModuleId就不带双引号了。

zxm8513优快云博客 352

Delphi JSON总结

Delphi 解析JSON的方法,就我已知的,有三种: 1. Qjson 2. SuperObject 3. System.JSON (Delphi XE 自带) 为方便看效果, 使用Delphi 2007演示Qjson和SuperObject的使用,使用Delphi XE 10.1Berlin演示System.JSON的使用。 1. Delphi 2007使用Qjson(uses Qjson)和SuperObjec(uses superobjec...

GuoGuoABC 3492

Delphi中的JSON解析与处理实战教程

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它基于JavaScript的一个子集,但JSON是完全独立于语言的文本格式。尽管它看起来像JavaScript语法,但JSON作为一个开放标准,在各种编程语言中都得到了支持和实现。本章将为不熟悉JSON的读者提供一个基础介绍,涵盖JSON的数据类型、结构以及它在Web应用中的广泛应用。我们还将探讨JSON与XML等其他数据格式相比的优势。

weixin_35649491的博客 1287

Delphi 解析JSON

亲测在 RAD Studio 10.3 正常 参考数据 { "五班": [ { "姓名": "张三", "成绩": 75.5 }, { "姓名": "李四", "成绩": 21.7 }, { "姓名": "王五", "成绩": 75.52 }, {

小印丶的笔记 1417

Delphi中使用SuperObject解析JSON实战教程

JSON(JavaScript Object Notation)是一种基于文本的轻量级数据交换格式,易于人类阅读和编写,也易于机器解析和生成。它基于JavaScript的一个子集,但与语言无关,广泛用于Web服务和客户端之间的数据传输。SuperObject 是一个开源的 Delphi JSON 解析库,它提供了面向对象的方式处理 JSON 数据结构,并支持多种操作方式,包括动态解析、构建、修改和序列化 JSON 数据。

weixin_42668301的博客 922

Delphi JSON处理工具包

JSON(JavaScript Object Notation)已经成为数据交换的常用格式,尤其是在Web应用中。Delphi作为一款功能强大的开发工具,通过JSON控件提供了对JSON数据格式的全面支持。这些控件不仅能够解析和生成JSON数据,还提供了数据绑定和数据导航的功能。对于Delphi开发者来说,这意味着可以更加便捷地处理JSON数据,实现快速开发。在这一章中,我们将对Delphi JSON控件的主要功能进行介绍,并探讨它们是如何简化JSON数据处理过程的。

weixin_28787801的博客 1161

【Delphi 爬虫库 2】使用封装好的 JSON 解析库对 JSON 数据进行解析

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。

记录日常技术经验 1840

JsonDataObjects:Delphi 2009 及更新版本的 JSON 解析器

Json 数据对象 这个 Delphi 单元包含一个 JSON 解析器,支持 Delphi 2009-10Seattle 和平台 Win32、Win64 和 ARM Android(MacOS 和 iOS 可能工作)。 使用 GIT 克隆 > git clone git@github.com:ahausladen/JsonDataObjects.git 或者 > git clone https://github.com/ahausladen/JsonDataObjects.git 这将为您提供 Json 数据对象存储库。 如何安装 克隆 JsonDataObjects 存储库 将JsonDataObjects.pas单元添加到您的项目中。 特征 无需转换即可解析 UTF8 和 UTF16 的快速双 JSON 解析器 自动创建数组和对象 带有隐式运算符的轻松访问模式 紧凑和格式化的输出模

delphi 解析Json格式

SuperObject 是开源的 Delphi 的 JSON 工具包,可生成 JSON 数据以及进行 JSON 解析。 unit Unit6; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TF

delphi藏经阁 2万+

Delphi XE7解析JSON的4种方法ParsingJsonWithFiremonkey.rar

Delphi XE7解析JSON的4种方法ParsingJsonWithFiremonkey

Delphi XE7中解析JSON

Delphi XE7中解析JSON,使用Delphi的system.jon单元来实现

DELPHI 解析 JSON

JSON相对XML轻量了很多,考虑到以后WEBSERVICE可以通过JSON实现DELPHI的程序和WEBSERVICE进行交互,今天就想去看一下DELPHI如何解析JSON. 比如:如何将: {"metaData":[{"a":"哇","b":"d"},{"a":"哇","b":"d"}],"success":true,"totalProperty":4} 这个JOSN字符串用类...

dibodang1423的博客 168

利用python爬取东方财富网股吧评论并进行情感分析(一)

利用python爬取东方财富网股吧评论(一) python-东方财富网贴吧文本数据爬取 分享一下写论文时爬数据用到的代码,有什么问题或者改善的建议的话小伙伴们一起评论区讨论。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新的界面设计 ,将会带来全新的写作体验; 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示; 增加了 图片拖拽 功能,你可以将本地的图片直

YMG521000的博客 1万+

Delphi中使用ISuperObject解析Json数据

  Java、Php等语言中都有成熟的框架来解析Json数据,可以让我们使用很少的代码就把格式化好的json数据转换成程序可识别的对象或者属性,同时delphi中也有这样的组件来实现此功能,即IsuperObject。如果还没有这个组件的请在网上搜索下载或者在下面留言处留下你的邮箱向本人索取。   下面先说一下ISuperObject中几个常用的函数 functionSO(const s...

weixin_30521649的博客 1924

【机器人路径规划】基于改进型A*算法的机器人路径规划(Python代码实现)

本文针对传统A算法在机器人路径规划中存在的搜索效率低、路径不平滑等问题,提出了一种改进型A算法。该算法通过引入跳点搜索(JPS)技术优化子节点扩展方式,结合贝塞尔曲线或B样条曲线进行路径平滑处理,并采用动态启发式函数和自适应邻域搜索策略,显著提升了路径规划的效率和路径质量。实验结果表明,改进型A*算法在复杂环境下能有效减少搜索节点数量,缩短路径长度,提高路径平滑性,且具备动态避障能力。

2501_92867626的博客 1583

INS/伪距组合导航(2)

伪距惯导组合导航

u014430081的博客 828

delphi解析json数据的方法

delphi7解析json数据 1. 定义一个(TsuperArray的变量) aSuperArray: TSuperArray;(需要引入Ticketservice) 2.定义vjson:ISuperObject;(引入Tsuperobject) 3.vJson:=so(s1);将json数据加载到vjson中 4.第一层key值直接获取 asuperarray:=vjson['Resu

qq_24932309的博客 1万+

NWD 格式转换 STL 全流程:专业方案与迪威模型网在线转换详解

在3D模型处理中,将NWD文件转换为STL格式是常见的需求,特别是在3D打印和计算机辅助制造等领域。NWD文件由Autodesk开发,主要用于建筑、工程和施工行业,包含丰富的几何图形和材质信息,但因其专有格式和大文件大小,限制了其应用范围。相比之下,STL格式广泛应用于3D打印,仅包含表面几何信息。转换NWD到STL的原因包括拓展模型应用场景和便于模型编辑。转换方法包括使用专业软件如Autodesk Navisworks配合Blender或3ds Max,或使用专门的转换工具如CADExchanger。

技术说明博主 2540

【Delphi】HTTP通讯及JSON解析

HttpPost安全地执行HTTP POST请求,确保线程安全。发送JSON格式的数据作为请求体。处理可能发生的网络通信异常,并记录相关信息。返回从指定URL获取到的数据,通常是以JSON格式返回的内容。这种方法适用于需要频繁进行HTTP POST请求的应用程序,特别是当这些请求可能会被多个线程同时触发时。通过使用临界区,可以有效地避免多线程环境下的资源竞争问题;而通过配置HTTP请求和响应的属性,可以确保与服务器之间的通信遵循特定的规范,如支持JSON数据格式和正确的字符编码。

专注上位机开发、机器视觉、机器学习、嵌入式软硬件开发 2663

RH850从0搭建Autosar开发环境【23】- Davinci Configurator之DCM实操实现DID的读取写入

RH850从0搭建Autosar开发环境【23】- Davinci Configurator之DCM实操实现DID的读取写入,结合Developer实现

weixin_42412049的博客 1810

高通开发系列 - System之FOTA/DFOTA包制作和升级

高通开发系列 - System之FOTA/DFOTA包制作和升级

fulinux的博客 4222

delphi 解析json java_DELPHI 解析 JSON

JSON相对XML轻量了很多,考虑到以后WEBSERVICE可以通过JSON实现DELPHI的程序和WEBSERVICE进行交互,今天就想去看一下DELPHI如何解析JSON.比如:如何将:{"metaData":[{"a":"哇","b":"d"},{"a":"哇","b":"d"}],"success":true,"totalProperty":4}这个JOSN字符串用类来表示。网上查了一下,...

weixin_34489089的博客 325

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

【亲测免费】 Delphi 7 JSON 解析控件:轻松处理JSON数据

Delphi 7 JSON 解析控件:轻松处理JSON数据 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在现代软件开发中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,被广泛应用于各种编程语言和平台。然而,对于使用Delphi 7的开发者来说,处理JSON数据可能并不是一件轻松的事情。为了解决这一问题,我们推出了 De...

gitblog_09786的博客 1352

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

上一篇: 使用Delphi做蓝牙BLE开发的一个问题
下一篇: Delphi 的 RSA 库 LockBox
pcplayer
博客等级 码龄26年 633粉丝 284原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值