Delphi DataSnap框架向JSON消息添加内容

Ron*_*Ron 6 delphi rest json datasnap

我正在使用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"
          }
}
Run Code Online (Sandbox Code Playgroud)

格式良好的JSON.

问题是,当客户端收到消息时,会添加一些东西,它看起来像这样:

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

"result"在前面得到了一堆反斜杠字符和标签.

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

MyD*_*Tom 5

要摆脱"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;
Run Code Online (Sandbox Code Playgroud)

REST服务响应如下所示: {"result":[{"name":"asdfasdf"}]}

我补充说Handled := true;:

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

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;
Run Code Online (Sandbox Code Playgroud)

现在的结果如下:{"name":"asdfasdf"}

PS.答案在这里找到:REST响应的FormatResult事件部分.


小智 2

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

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

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

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