2

我在 Delphi XE6 中创建了一个简单的测试应用程序,我想开始使用 Delphi 的 JSON 来处理来自自定义编码 Web 服务器的请求(我很忙)

procedure TForm1.Button1Click(Sender: TObject);
var
  Servermethods : TServerMethods1Client;
  JsonArray : TJSONArray;
  JsonValue: TJSONValue;
  JSonObj: TJSONObject;
  JSPair: TJSONPair;
  s: String;
begin
  JSonObj := TJSONObject.Create;
  JSonObj.AddPair(TJSONPair.Create('a','abcde'));
  JsonArray := TJSONArray.Create;
  JsonArray.AddElement(JSonObj);

  JsonValue := JsonArray.Items[0];
  JSonObj := (JsonValue as TJSONObject);

  JSPair := TJSONPair(JSonObj);

  s := JSPair.JsonString.Value;
end;

当您检查/评估任何 JSON 对象 (CTRL+F7) 时,根本没有任何信息,在检查器中我只是得到“()”-[又名空]-

但是为了争论,如果我改变对 JSONObj.Tostring 的调用,我会得到完整的 json 字符串({“a”,“abcde”}),这很酷,但当它到达最后一行时

s := JSPair.JsonString.Value;

繁荣!访问冲突。

任何帮助,将不胜感激

* 编辑 * 我实际上是在要求我让某人在 XE6 中对此进行测试,看看它是否是一个错误?还是我错过了一些非常明显的东西?

4

2 回答 2

2

JSONPair 是 JSONObject 的一部分,因此您不能将 JSONObject 强制转换为 JSONPair。使用 JSONObject.Get 获取该对。

于 2014-05-06T19:52:58.733 回答
0

在我看来,您还将 TJSONValue 转换为 TJSONPair。

最后几行将独立的 TJSONValue 对象分配给 JSONObj。然后将其转换为 JSONPair。(以不安全的方式 - 没有运行时类型兼容性检查)。我认为这里的值只是一对中的一个成员,否则与它不兼容。

在这种情况下,您也可以尝试使用“as”运算符,这可能会使您更容易发现这些功能。

IE

JSPair := JSONObj 作为 TJSONPair;

运行时应该抱怨类型转换问题。

它还可以说明我是否正确地说这些类确实位于类继承树的不同“长凳”上,因此您的访问冲突。

于 2014-05-06T19:37:00.930 回答