网站首页 > 技术文章 正文
定义:不同的地理信息系统或地理信息系统与其他信息系统之间实施数据双向交换时采用的数据格式
引自百度百科
据百度百科上的描述数据交换这个词最早是在《地理信息系统名词》第二版,很明显不是用来做编程的。在编程方面数据交换格式仅仅是一种格式,当前主流使用的格式有 3 种 : XML、JSON、YAML
既然是一种格式,那么它就需要标准,因为通过标准可以限定各个格式中的具体内容
XML
XML(全称EXtensible Markup Language),在我看来它是一种古老的数据交换格式,因为从我接触到编程开始它就已经存在了
标准所在网址:https://www.w3.org/TR/1998/REC-xml-19980210
最新文档地址:https://www.w3.org/TR/REC-xml/
其实XML的标准一直是1.0,至少我没有见过其他的,一般情况下我们在编写XML文档的时候都需要遵循一个约束文件,这个约束文件中规定了你可以编写的内容。约束文件存在的方式也有两种,原来是 DTD 格式现在主流的是 Schema
XML 如果想完整的学习还是比较费劲的,不过一般情况下要求约束文档能看懂,XML内容会编写即可
参考网址:https://www.w3school.com.cn/x.asp
Delphi解析可使用 TXMLDocument(Delphi自带),此外也可以使用微软的 MSXML2 我没有这种需求所以并没有深入研究
官方文档:http://docwiki.embarcadero.com/Libraries/Sydney/en/Xml
JSON
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。相比于XML格式JSON更为简单明了
标准文档地址:http://www.json.org/json-zh.html
具体的语法规则可以参考上面网址的文档内容,中文的
Delphi官方(当前最新版本DelphiXE10.4.2)已经支持对于JSON的解析了,官方文档地址
http://docwiki.embarcadero.com/Libraries/Sydney/en/System.JSON
需要注意的是有些类是Tokyo 10.2新增的,在使用的时候需要检查一下自己的版本
YAML
YAML (全称YAML Ain’t Markup Language),YAML不是标记语言的意思,YAML是便于人阅读基于unicode 编码的各种语言的序列号标准。
YAML语言的设计参考了JSON,XML和SDL等语言。YAML 强调以数据为中心,简洁易读,编写简单
官网地址:http://yaml.org
一个让人头皮发麻的站点
学习的话可以参考 阮一峰 老师的博客内容,地址:https://www.ruanyifeng.com/blog/2016/07/yaml.html
没有找到官方支持,不过在GitHub上有一个开源库是支持Delphi解析YAML格式数据的,有兴趣的朋友可以去研究
地址:https://github.com/neslib/Neslib.Yaml
最后我想说我非常讨厌这种数据格式,和python一样依靠缩进和空格控制语法。。。
JSON解析案例
将原来视频中讲解的代码在DelphiXE10.4.2上进行了重构
uses
System.JSON, System.Generics.Collections, System.JSON.Serializers,
System.SysUtils;
type
{ 实体类,主要是用于JSON字符串和类对象的互相转换 }
TStudent = class(TObject)
private
FName: string;
FAge: Integer;
public
property Name: string read FName write FName;
property Age: Integer read FAge write FAge;
constructor Create; overload;
constructor Create(FName: string; FAge: Integer); overload;
end;
constructor TStudent.Create;
begin
end;
constructor TStudent.Create(FName: string; FAge: Integer);
begin
Self.FName := FName;
Self.FAge := FAge;
end;
begin
{ 定义一个JSON字符串 }
var
UserJson := '{"FName":"小黑","FAge":18}';
{ 创建序列化对象 }
var
Serializer := TJsonSerializer.Create();
{ 反序列化,其实就将字符串转为对象 }
var
Student := Serializer.Deserialize<TStudent>(UserJson);
Writeln('反序列化:' + Student.Name + ',' + Student.Age.ToString);
{ 列表转换,将TLIst容器转为字符串,也可以说是数组转换 }
var
List := TList<TStudent>.Create;
List.Add(TStudent.Create('小白', 30));
List.Add(TStudent.Create('萧蔷', 30));
// 创建序列化对象
Serializer := TJsonSerializer.Create();
Writeln('序列化:' + Serializer.Serialize < TList < TStudent >> (List));
var
{ 一个比较复杂的json字符串 }
Users := '{"FListHelper":{"FCount":2},"FItems":[{"FName":"小白","FAge":30},{"FName":"萧蔷","FAge":30}],"FComparer":{}}';
// 创建序列化对象
Serializer := TJsonSerializer.Create();
{ 可以尝试下这里会不会有问题,当字段匹配时居然可以直接转换 }
var
UserList := Serializer.Deserialize < TList < TStudent >> (Users);
for var Stu in UserList do begin
Writeln('反序列化:' + Stu.Name + ',' + Stu.Age.ToString);
end;
{ 获取指定字段 }
Writeln(TJSONObject.ParseJSONValue(Users).GetValue<TJSONObject>
('FListHelper').GetValue<string>('FCount'));
Writeln(TJSONObject.ParseJSONValue(Users).GetValue<TJSONArray>('FItems')
.Count.ToString);
Readln;
end.
其实Delphi自带的JSON解析已经够用了,如果不能满足你的话有一个开源库你可以尝试,不过我看它最近一次更新代码是 3 年前....
Github地址:https://github.com/hgourvest/superobject
学习资料(万一老师的博客):https://www.cnblogs.com/del/category/215158.html
- 上一篇: 逆天了,lowdb 将 JSON 当数据库用火了
- 下一篇: JSON.parse 的6大特性
猜你喜欢
- 2025-01-13 postman——post请求数据类型
- 2025-01-13 比较一下JSON与XML两种数据格式?
- 2025-01-13 JSON&Ajax介绍和实例
- 2025-01-13 NET Core处理WebAPI JSON返回null为空
- 2025-01-13 jsoncpp使用总结
- 2025-01-13 微信WeUI设计规范文件下载及使用方法
- 2025-01-13 Spring Boot 中使用 JSON Schema 来校验复杂JSON数据
- 2025-01-13 C#解析多层嵌套的JSON数组
- 2025-01-13 web后端正确的返回JSON
- 2025-01-13 3分钟短文 | Linux 使用curl发起post请求的4个常用方式
你 发表评论:
欢迎- 577℃几个Oracle空值处理函数 oracle处理null值的函数
- 573℃Oracle分析函数之Lag和Lead()使用
- 559℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 557℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 554℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 543℃【数据统计分析】详解Oracle分组函数之CUBE
- 531℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 527℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端富文本编辑器 (47)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle 中文 (51)
- oracle的函数 (57)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)