6

我正在使用 Delphi XE DataSnap REST 服务器并尝试返回 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"前面的标签。

我想知道是否有人知道我为什么要得到这些额外的东西以及如何摆脱它。

4

3 回答 3

7

要摆脱"result"标签,您应该OnFormatResult使用TDSHTTPWebDispatcher. 特别是价值Handled。的值Handledfalse默认值。如果设置为true,则传递给用户的结果将不会包装在"result"JSON 对象中。如果它是假的,那么它将被包裹在这个对象中。

例子。我有这样的代码:

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。答案在这里找到:REST Responses 的 FormatResult Event 部分

于 2014-05-26T06:09:55.583 回答
4

您发布的 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。

于 2011-01-29T22:47:02.863 回答
2

您是否使用 Delphi Desktop 作为客户端?如果是,也许您可​​以尝试从您的方法返回其他返回值,因为 Delphi 会自动将任何返回类型转换为 JSON

例如:返回一个 DBXReader 将被转换为一个 JSON 类型

如果您有其他客户端(php、java、flex),我无法帮助您。我有同样的问题..我创建了一个接收 JSONObject 作为参数的方法,我做了一个简单的 PHP 代码来调用这个方法......我创建了一个对象类并将它传递给它..在服务器中它无法将 JSONObject 转换为 Object ... UnMarshall 执行时发生错误..

我的测试只适用于原始类型!

于 2011-01-29T12:09:26.347 回答