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;

следует жаловаться на проблемы с типизацией при запуске.

Было бы также сказать, правильно ли я сказал, что эти классы действительно находятся на разных "скамьях" дерева наследования классов, и, следовательно, ваше нарушение доступа.

Другие вопросы по тегам