为何使用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
相关产品推荐
相关产品推荐

