Delphi XE 6 с использованием методов и реализаций System.JSON не работает
Я создал простое тестовое приложение в Delphi XE6, и я хочу начать использовать JSON от Delphi для обработки запросов от пользовательского кода веб-сервера (которым я занят)
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;
Boom! Нарушение доступа.
Любая помощь будет оценена
* Edit * Что я на самом деле прошу, чтобы кто-то проверил это в XE6, чтобы увидеть, если это ошибка? или я что-то упускаю очень очевидное?
2 ответа
JSONPair является частью JSONObject, поэтому вы не можете привести JSONObject к JSONPair. Используйте JSONObject.Get, чтобы получить пару.
Мне кажется, что вы также приводите TJSONValue к TJSONPair.
Последние несколько строк назначают автономный объект TJSONValue для JSONObj. Затем это приводится к JSONPair. (небезопасным способом - тогда нет проверки совместимости типов во время выполнения). Я думаю, что значение здесь является просто членом пары и не совместимо с этим в противном случае.
В этом случае вы также можете попробовать использовать оператор "as", что может значительно облегчить вам поиск функций.
Т.е.
JSPair: = JSonObj как TJSONPair;
следует жаловаться на проблемы с типизацией при запуске.
Было бы также сказать, правильно ли я сказал, что эти классы действительно находятся на разных "скамьях" дерева наследования классов, и, следовательно, ваше нарушение доступа.