我在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中测试这个,看看它是不是一个错误?或者我错过了一些非常明显的东西?
答案 0 :(得分:2)
JSONPair是JSONObject的一部分,因此您无法将JSONObject强制转换为JSONPair。使用JSONObject.Get获取该对。
答案 1 :(得分:0)
在我看来,你也在向TJSONPair投射TJSONValue。
最后几行将独立的TJSONValue对象分配给JSONObj。 然后将其转换为JSONPair。 (以不安全的方式 - 然后没有运行时类型兼容性检查)。 我认为这里的值只是一对中的一个成员,并且与其他成员不兼容。
您可以尝试使用" as"在这种情况下,操作员可能会更容易发现这些功能。
即
JSPair:= JSonObj as TJSONPair;
应该在运行时抱怨类型转换问题。
它也会告诉我说这些课程是否真的坐在不同的长椅上是对的。类继承树,以及您的访问冲突。