Delphi DataSnap Framework добавляет материал в сообщение JSON - PullRequest
6 голосов
/ 28 января 2011

Я работаю с REST-сервером Delphi XE DataSnap и пытаюсь вернуть сериализованный объект JSON. Результат, который мой метод возвращает клиенту, выглядит следующим образом:

{"type":"ServerMethodsUnit1.TJSONIssue",
 "id":1,
 "fields":{
           "FIssueNo":90210,
           "FTitle":"Beverly Hills...that''s where I want to be",
           "FKind":"Wishlist"
          }
}

Хорошо сформированный JSON.

Проблема в том, что когда сообщение получено клиентом, к нему добавляется куча вещей, и это выглядит так:

{"result": ["{\"type\":\"ServerMethodsUnit1.TJSONIssue\",
              \"id\":1,
              \"fields\":{
                          \"FIssueNo\":90210,
                          \"FTitle\":\"Beverly Hills...that's where I want to be\",
                          \"FKind\":\"Wishlist\"}
             }
            "
           ]
}

Я получаю кучу символов обратной косой черты и этот тег "result" впереди.

Мне было интересно, кто-нибудь знает, почему я получаю этот дополнительный материал и как от него избавиться.

Ответы [ 3 ]

5 голосов
/ 26 мая 2014

Чтобы избавиться от тега "result", вы должны использовать OnFormatResult событие TDSHTTPWebDispatcher.Особенно значение Handled.Значение Handled по умолчанию равно false.Если установлено значение true, то результат, переданный пользователю, не будет заключен в объект "result" JSON.Если значение равно false, оно будет заключено в этот объект.

Пример.У меня есть такой код:

function TServerMethods1.EchoStringJSON(Value: string): TJSONObject;
var
  JSONObj : TJSONObject;
begin
  JSONObj := TJSONObject.Create;
  JSONObj.AddPair(TJSONPair.Create('name',Value));
  result := JSONObj;
end;

Ответ службы REST выглядит следующим образом: {"result":[{"name":"asdfasdf"}]}

Я добавляю Handled := true;:

procedure TWebModule1.DSHTTPWebDispatcher1FormatResult(Sender: TObject;
  var ResultVal: TJSONValue; const Command: TDBXCommand; var Handled: Boolean);
begin
  Handled := true;
end;

выглядит ответ службы RESTкак это: [{"name":"asdfasdf"}].

Еще есть "[]".Поэтому я добавляю дополнительный код:

procedure TWebModule1.DSHTTPWebDispatcher1FormatResult(Sender: TObject;
  var ResultVal: TJSONValue; const Command: TDBXCommand; var Handled: Boolean);
var
  Aux: TJSONValue;
begin
  //remove [] element
  Aux := ResultVal;
  ResultVal := TJSONArray(Aux).Items[0];
  TJSONArray(Aux).Remove(0);
  Aux.Free;
  //we do not need "result" tag
  Handled := true;
end;

Теперь результат выглядит так: {"name":"asdfasdf"}

PS.Ответ был найден здесь: раздел Событие FormatResult для ответов REST .

4 голосов
/ 30 января 2011

JSON, который вы опубликовали, представляет результат для удаленного метода, который возвращает строку, а не JSONObject. Правильный способ вернуть JSONObject должен быть следующим (не скомпилировано / протестировано):

function TMyRemote.GetSomething: TJSONValue;
begin
  Result := TJSONObject.Create;
  Result.Add("Name","Daniele Teti"); //used the overloaded version of add (string, string)
end;

Теперь JSON должен быть правильным. Элемент RESULT в строке результата является заданным. Вы можете прочитать первый элемент массива результатов и получить исходный JSONObject.

2 голосов
/ 29 января 2011

Используете ли вы Delphi Desktop в качестве клиента?если да, может быть, вы можете попробовать другой возврат из вашего метода, потому что Delphi автоматически преобразует любой тип возвращаемого значения в JSON

, например: return DBXReader будет преобразован в тип JSON

В случае, еслиу вас есть другой клиент (php, java, flex), я не могу вам помочь.У меня та же проблема .. Я создал метод для получения JSONObject в качестве параметра, и я сделал простой PHP-код для вызова этого метода ... Я создал объектный класс и передал его .. На сервере он не может преобразовать JSONObject в Object... ошибка возникает при выполнении UnMarshall ..

Мои тесты работают только с примитивными типами!

...