Delphi XE7:如何使用 System.JSON 更改 JSON 值(相对于 SuperObject)

2023-11-22

我需要加载一个 JSON 文件,更改一个值,然后将其写回磁盘。

使用 SuperObject 很容易做到这一点,但是如何使用 System.JSON 单元做同样的事情呢?

const
  PathToX = 'AllCategories.Category[0].subCategory[0].products[0].views.view[0].x';

var
  JsonFilename: string;

  JO: ISuperObject; // from the SuperObject unit
  JV: TJsonValue;   // from the System.Json unit

begin
  JsonFilename := ExtractFilePath(Application.ExeName)+'product.json');

  // Using the SuperObject unit:
  JO := SO(TFile.ReadAllText(JsonFilename));

  WriteLn('The old value of "x" is ', JO[PathToX].AsString);
  WriteLn('Changing value of x to "123"');
  JO.S[PathToX] := '123';   // Set the value of "x"
  WriteLn('The new value of "x" is ', JO[PathToX].AsString);

  // Now trying to do the same thing using the System.Json unit:
  JV := TJSONObject.ParseJsonValue(TFile.ReadAllText(JsonFilename));

  WriteLn('The old value of "x" is ', JV.GetValue<string>(PathToX));
  WriteLn('Changing value of x to "123"');
// Question: What code should go here to set the value of "x" using System.JSON ??? 
  WriteLn('The new value of "x" is ', JV.GetValue<string>(PathToX));

System.JSON 中似乎没有与“GetValue”方法等效的“SetValue”方法。


TJSONObject确实支持类似于 SuperObject 的路径评估器。因此,您不必每次手动钻取一个对象的 JSON 值树(尽管如果您愿意的话当然可以)。

但是,那System.JSON类实际上不是为修改现有数据(信不信由你)!它们设计用于parsing数据,以及creating新数据。所有表示简单值(整数、布尔值、字符串)的 JSON 类都是只读。幸运的是,TJSONPair类允许一个值是replaced,所以你必须利用它。

尝试这样的事情:

uses
  ..., System.JSON;

var
  JsonFilename: string;
  JV: TJSONValue;
  JO: TJSONObject;
  JoX: Integer;
  JoPair: TJSONPair;
begin
  JsonFilename := ExtractFilePath(Application.ExeName) + 'product.json';

  JV := TJSONObject.ParseJSONValue(TFile.ReadAllText(JsonFilename));
  if JV = nil then raise Exception.Create('Cannot parse file: ' + JsonFilename);
  try
    JO := JV as TJSONObject;

    JoX := JO.GetValue<Integer>('AllCategories.Category[0].subCategory[0].products[0].colors.color[0].views.view[0].x');
    WriteLn('The old value of "x" is ', JoX);

    WriteLn('Changing value of "x" to "123"');
    JoPair := JO.GetValue<TJSONObject>('AllCategories.Category[0].subCategory[0].products[0].colors.color[0].views.view[0]').Get('x');
    JoPair.JsonValue.Free;
    JoPair.JsonValue := TJSONNumber.Create(123);
    WriteLn('The new value of "x" is ', JoPair.JsonValue.Value);

    SaveAsDialog.FileName := JsonFilename;
    if SaveAsDialog.Execute then TFile.WriteAllText(SaveAsDialog.FileName, JO.ToJSON);
  finally
    JV.Free;
  end;
end;

或者:

uses
  ..., System.JSON;

var
  JsonFilename: string;
  JV: TJSONValue;
  JO: TJSONObject;
  JoX: TJSONPair;
begin
  JsonFilename := ExtractFilePath(Application.ExeName) + 'product.json';

  JV := TJSONObject.ParseJSONValue(TFile.ReadAllText(JsonFilename));
  if JV = nil then raise Exception.Create('Cannot parse file: ' + JsonFilename);
  try
    JO := JV as TJSONObject;

    JoX := JO.GetValue<TJSONObject>('AllCategories.Category[0].subCategory[0].products[0].colors.color[0].views.view[0]').Get('x');
    WriteLn('The old value of "x" is ', JoX.JsonValue.Value);

    WriteLn('Changing value of "x" to "123"');
    JoX.JsonValue.Free;
    JoX.JsonValue := TJSONNumber.Create(123);
    WriteLn('The new value of "x" is ', JoX.JsonValue.Value);

    SaveAsDialog.FileName := JsonFilename;
    if SaveAsDialog.Execute then TFile.WriteAllText(SaveAsDialog.FileName, JO.ToJSON);
  finally
    JV.Free;
  end;
end;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Delphi XE7:如何使用 System.JSON 更改 JSON 值(相对于 SuperObject) 的相关文章

随机推荐

  • MySQL 中标志的 BIT(1) 或 TINYINT

    我经常有一些表需要存储一个标志 该标志可以是 1 或 0 真或假等 我以前用过 TINYINT 我应该使用 BIT 1 吗 为什么或者为什么不 如果您使用的 mysql 版本高于 5 0 3Bit不再是别名Tinyint但如果你创建一个bi
  • 如何从视图中获取托管活动?

    我有一个Activity with 3 EditText和一个自定义视图 它充当专用键盘以将信息添加到EditTexts 目前我正在通过Activity进入视图 以便我可以获得当前聚焦的编辑文本并从自定义键盘更新内容 有没有办法引用父活动并
  • preg_match 多个单词

    我想测试一个字符串以查看它包含某些单词 i e string The rain in spain is certain as the dry on the plain is over and it is not clear preg mat
  • 将Cocos2D添加到xCode 4中的项目中

    我正在从事一个项目 需要具有相同的原生部分 cocoa touch 和 cocos2d 中的某些部分 我已经把所有的原生都做了 现在我需要在项目中集成cocos2d 我的问题是我无法成功地将 cocos2d 库添加到我的项目中 有什么好的解
  • java.net.SocketException:套接字失败:EPERM(不允许操作)

    我正在开发一个包含多项活动的 Android Studio 项目 我目前正在尝试读取本地主机上 Java Servlet 的输出 但由于套接字权限 它似乎崩溃了 我创建了一个新项目 使用完全相同的代码并且工作完美 所以我不明白为什么不愿意为
  • 对每个数据库运行查询 (mysql)

    我正在寻找一种直接的方法来对我的 mysql 服务器上托管的所有数据库运行查询 我有一堆 Magento 安装 我想截断所有数据库上的所有 Magento 日志表 日志客户 访客日志 日志访客信息 log url 日志地址信息 日志引用 报
  • android模拟器可以播放音频吗

    我想录制并将录制的声音传递到手机扬声器 但我无法使录制代码正常工作 应用程序崩溃 在这里查看我的尝试 所以我现在试图看看模拟器是否可以做任何与音频相关的事情 我将 1 秒的录音复制到了 SD 卡上 格式为 wav 16 位 pcm 44k
  • Color 和 SolidColorBrush 之间的区别澄清

    好吧 这一直困扰着我 我还没有真正找到任何明确的答案作为两者之间差异的原因 原因Color SolidColorBrush所以我想知道是否有人可以在这方面教育我 我已经知道用法上的差异 例如我可以使用SolidColorBrush就像我说的
  • 使用自签名 SSL 证书时出现“SocketException:未实现未连接的套接字”

    我已经向 jmeter user 邮件列表提出了同样的问题 但我也想在这里尝试 所以至少我可以在找到答案后更新它 我使用时遇到问题JMeter使用自签名 SSL 证书测试 Tomcat Web 应用程序 JMeter 抛出带有消息的 Soc
  • Firefox、Chrome、Safari 对于 MP4 HTML5 视频有灰色背景

    任何具有白色背景的视频 我可以制作 在 Firefox Chrome 和 Safari 中都会变成灰色 在 IE 中为白色 嗯 在我的 Windows 机器上它是灰色的 在我的 Android 手机 平板电脑和 Mac 上它是白色的 我正在
  • 如何使用 Node.js 实现安全的 REST API

    我开始计划使用 Node js express 和 mongodb 构建 REST API 该 API 为网站 公共和私人区域 提供数据 之后可能还会为移动应用程序提供数据 前端将使用 AngularJS 开发 几天来 我阅读了很多有关保护
  • 使用Kafka Connect时如何转换所有时间戳字段?

    我正在尝试将所有时间戳字段转换为格式为字符串类型yyyy MM dd HH mm ss 要转换多个字段 我必须为每个字段单独创建一个转换 transforms tsFormat1 tsFormat2 tsFormatN transforms
  • 字符串数组:“在‘i++’处更改的值从未被使用过”

    这是我的代码 String queries new String 2 int i 0 Boolean result queries i
  • 离线 Firebase

    我正在实现一个以 Firebase 作为后端的 AngularJS Web 应用程序 它也应该可以离线工作 多用户同步问题应该非常有限 因为该应用程序按设计仅允许new离线时的数据输入 我了解 Firebase 具有离线功能 从某种意义上说
  • 在 Spark 中将日期转换为月底

    我有一个 Spark DataFrame 如下所示 Create DataFrame df lt data frame name c Thomas William Bill John dates c 2017 01 05 2017 02 2
  • 使用 Json.Net 将空字符串转换为 null

    我无法找到自动的方法反序列化 服务器端 全部EmptyOrWhiteSpace字符串到null Json Net 默认情况下只是将值分配给对象属性 我需要逐个字符串验证它是否为空或空格 然后将其设置为 null 我需要在反序列化时完成此操作
  • 绘制 geom_bar() 时避免 ggplot 对 x 轴进行排序

    我想用 ggplot 绘制以下数据 SC LTSL BM 16 8275 SC STSL BM 17 3914 proB FrBC FL 122 1580 preB FrD FL 18 5051 B Fo Sp 14 4693 B GC S
  • 如何提取批处理文件中$后面的文本?

    我有一个批处理文件 其中包含以下内容 50 A Description of the item 23 我有一个脚本可以提取之前的内容 标志 但我需要提取之后的所有内容 sign 这是脚本 for f tokens 1 delims a in
  • Pandas str.contains - 搜索字符串中的多个值并在新列中打印这些值[重复]

    这个问题在这里已经有答案了 我刚刚开始使用 Python 编码 想要构建一个解决方案 您可以在其中搜索字符串以查看它是否包含给定的值集 我在 R 中找到了一个类似的解决方案 它使用 stringr 库 在字符串中搜索某个值 如果该值存在 则
  • Delphi XE7:如何使用 System.JSON 更改 JSON 值(相对于 SuperObject)

    我需要加载一个 JSON 文件 更改一个值 然后将其写回磁盘 使用 SuperObject 很容易做到这一点 但是如何使用 System JSON 单元做同样的事情呢 const PathToX AllCategories Category