You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何使用TJSONObject的TryGetValue方法无法正常获取值?

问题原因及解决方案

你的问题出在Delphi的TJSONObject.TryGetValue<T>方法的行为上——当你传入的键字符串包含冒号(:)这类特殊字符时,它会把这个字符串解析成JSON路径,而不是当作一个完整的键名来匹配。

比如你传入的isoDate1是2018-01-02T10:00:00.000Z,方法会尝试拆分这个路径:先找2018-01-02T10这个键,再找它下面的00子键,显然这和你实际存储的键完全不匹配,所以返回false。


解决方案1:使用Get方法直接获取键值

放弃泛型的TryGetValue,改用TJSONObject.Get方法,它会直接按完整键名查找,不会解析路径:

procedure TForm1.Button5Click(Sender: TObject);
var 
  js : TJSONObject;
  isoDate1, isoDate2, data : string;
  jsonValue: TJSONValue;
begin
  isoDate1 := '2018-01-02T10:00:00.000Z';
  isoDate2 := '2018-01-02T10:10:00.000Z';
  js := TJSONObject.Create;
  try
    js.AddPair(TJsonPair.Create(isoDate1, 'TEST'));
    js.AddPair(TJsonPair.Create(isoDate2, 'TEST2'));
    OutputDebugString(PChar(js.ToString));
    
    jsonValue := js.Get(isoDate1);
    if Assigned(jsonValue) then
    begin
      data := jsonValue.Value;
      ShowMessage(data);
    end
    else
    begin
      ShowMessage('未找到对应数据:' + isoDate1);
    end;
  finally
    js.Free;
  end;
end;

我还加了try...finally块确保TJSONObject被正确释放,避免内存泄漏。


解决方案2:给键名加双引号,让TryGetValue当作字面量处理

如果你一定要用TryGetValue<T>,可以把键名用双引号括起来,告诉方法这是一个完整的键名,不是路径:

if js.TryGetValue<string>('"' + isoDate1 + '"', data) then
begin
  ShowMessage(data);
end else begin
  ShowMessage('未找到对应数据:' + isoDate1);
end;

这样TryGetValue就会把"2018-01-02T10:00:00.000Z"当作一个完整的键去匹配,就能成功找到对应的值了。


内容的提问来源于stack exchange,提问作者supermyz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:21:23