ToB企服应用市场:ToB评测及商务社交产业平台

标题: IDocList/IDocDict JSON for Delphi and FPC [打印本页]

作者: 商道如狼道    时间: 2024-5-23 11:50
标题: IDocList/IDocDict JSON for Delphi and FPC
IDocList/IDocDict JSON for Delphi and FPC

【英文原文】
多年来,我们的开源 mORMot 框架提供了多种方法来处理在运行时定义的数组/对象文档的恣意组合,比方通过 JSON,具有许多功能和非常高的性能。

我们的 TDocVariant自定义变体类型是处理这类无模式数据的一种强盛方式,但一些用户觉得它有些令人困惑。
因此,我们围绕它开辟了一套新的接口定义,以简化其使用,同时不牺牲其功能。我们围绕Python列表和字典对它们进行了建模,这已被证明是可行的——当然,也做了一些扩展。
TDocVariant的优缺点

多年来,我们的 TDocVariant可以存储任何基于JSON/BSON的文档内容,即:
每个 TDocVariant实例也是一个自定义的变体类型:
这种强盛功能也带来了一些缺点:
抱怨够了。
我们只需让它变得更好。
引入IDocList和IDocDict接口
我们引入了两个高级封装接口类型:
接口方法和定名遵循通常的Python列表和字典,并在安全且专用于类的IDocList和IDocDict类型中封装它们自己的TDocVariant存储。
您可能会在当代Delphi中如许写:
  1. var
  2.   list: IDocList;
  3.   dict: IDocDict;
  4.   v: variant;
  5.   i: integer;
  6. begin  
  7.   // 从项目创建一个新的列表/数组
  8.   list := DocList([1, 2, 3, 'four', 1.0594631]); // 默认情况下允许双精度值
  9.   // 遍历列表
  10.   for v in list do
  11.     Listbox1.Items.Add(v); // 将变量转换为字符串
  12.   // 或列表的一个子范围(使用类似Python的负索引)
  13.   for i in list.Range(0, -3) do
  14.     Listbox2.Items.Add(IntToStr(i)); // [1, 2] 作为整数
  15.   // 搜索某些元素的存在
  16.   assert(list.Exists(2));
  17.   assert(list.Exists('four'));
  18.   // 从JSON中获取一个对象列表,其中包含一个入侵者
  19.   list := DocList('[{"a":0,"b":20},{"a":1,"b":21},"to be ignored",{"a":2,"b":22}]');
  20.   // 枚举所有对象/字典,忽略非对象元素
  21.   for dict in list.Objects do
  22.   begin
  23.     if dict.Exists('b') then
  24.       ListBox2.Items.Add(dict['b']);
  25.     if dict.Get('a', i) then
  26.       ListBox3.Items.Add(IntToStr(i));
  27.   end;
  28.   // 删除一个元素
  29.   list.Del(1);
  30.   assert(list.Json = '[{"a":0,"b":20},"to be ignored",{"a":2,"b":22}]');
  31.   // 提取一个元素
  32.   if list.PopItem(v, 1) then
  33.     assert(v = 'to be ignored');
  34.   // 转换为JSON字符串
  35.   Label1.Caption := list.ToString;
  36.   // 显示 '[{"a":0,"b":20},{"a":2,"b":22}]'
  37. end;
复制代码
以及更多高级功能,如排序、搜索和表达式过滤:
[code]var  v: variant;  f: TDocDictFields;  list, list2: IDocList;  dict: IDocDict;begin  list := DocList('[{"a":10,"b":20},{"a":1,"b":21},{"a":11,"b":20}]');  // 根据嵌套对象的字段对列表/数组进行排序  list.SortByKeyValue(['b', 'a']);  assert(list.Json = '[{"a":10,"b":20},{"a":11,"b":20},{"a":1,"b":21}]');    // 使用条件表达式枚举列表/数组   for dict in list.Objects('b




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4