我正在将一些项目从Delphi 10.4迁移到Delphi 11.3. 我在JSON库方面遇到了一些问题:

请参阅以下代码:

第一个 case :

function TestCreate;
var
  LValue: Variant;
  LJSON: TJSONNumber;
begin
  LValue := 100;
  LJSON := TJSONNumber.Create(LValue);
end;

汇编这篇文章后,结果是:

  [dcc64 Error] _Unit.pas(74): E2251 Ambiguous overloaded call to 'Create'
  System.JSON.pas(435): Related method: constructor TJSONNumber.Create(const string);
  System.JSON.pas(439): Related method: constructor TJSONNumber.Create(const Double);

第二个 case :

function TestAddPair;
var
  LValue: Variant;
  LJSON: TJSONObject;
begin
  LValue := 100;
  LJSON := TJSONObject.Create();
  LJSON.AddPair('Test', LValue);
end;

汇编这篇文章后,结果是:

  [dcc64 Error] _Unit.pas(77): E2251 Ambiguous overloaded call to 'AddPair'
  System.JSON.pas(661): Related method: function TJSONObject.AddPair(const string; const Boolean): TJSONObject;
  System.JSON.pas(651): Related method: function TJSONObject.AddPair(const string; const Double): TJSONObject;
  System.JSON.pas(636): Related method: function TJSONObject.AddPair(const string; const string): TJSONObject;

这两种方法在Delphi 10.4上都可以正常运行,但在Delphi 11.3上无法编译. 有没有办法让它们编译?我不希望修改每个使用变体来创建/添加JSON的命令.

推荐答案

变量可以隐式转换为字符串或双精度类型,而不需要优先 Select 其中之一.

在R104中,接受字符串参数的构造函数是受保护的,而在11.3中,它是公共的.

正如Toon提到的,你可能无法避免更改所有的呼叫.

Update:或者,您可以为TJSONNumberTJSONObject创建类帮助器,并覆盖Variant.F.I.如下所示:

type
  TJSONNumberHelper = class helper for TJSONNumber
  public
    constructor Create(const AValue: Variant); overload;
  end;

constructor TJsonNumberHelper.Create(const AValue: Variant);
begin
  inherited Create(Double(AValue));
end;

Json相关问答推荐

JOLT将对象名作为新属性添加到主体中

如何使用JQ将JSON字符串替换为解析后的类似功能?

NiFi QueryRecord处理器- Select 可选的JSON属性

无法从MongoDB集合中检索正确的文档

VSCode 为 python 文件添加标尺,但不为 C 文件添加标尺.为什么?

Powershell v7 文本背景突出显示

PowerShell:如何将哈希表输出为 json 并使用 foreach 循环将其存储在变量中?

如何从条带订阅响应对象中正确获取 struct 项?

坚持弄清楚如何使用 api 响应来调用以从不同的链接检索响应

自定义将 struct 解组为切片映射

PowerShell - JSON/PsCustomObject - 为什么我的数组被扁平化为一个对象?

将 js Array() 转换为 JSON 对象以用于 JQuery .ajax

IE8 原生 JSON.parse 错误导致堆栈溢出

如何从Typescript 中的json响应中获取日期对象

Java JSON 序列化 - 最佳实践

消息通知产生此内容无法显示

如何按键查找特定的 JSON 值?

通过 JSON 发送 64 位值的公认方式是什么?

使用新的 Net Core 3.0 Json 时忽略属性

Javascript对象和JSON对象有什么区别