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

时间:2011-01-28 01:53:49

标签: delphi json rest 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"
          }
}

格式良好的JSON。

问题在于,当客户端收到消息时,会添加一些内容,它看起来像这样:

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

我在前面收到了一堆反斜杠字符和"result"标记。

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

3 个答案:

答案 0 :(得分:5)

要删除"result"代码,您应使用OnFormatResult TDSHTTPWebDispatcher事件。特别是值Handled。默认情况下,Handled的值为false。如果设置为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。答案在这里找到:section FormatResult Event for REST Responses

答案 1 :(得分: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。

答案 2 :(得分:2)

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

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

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

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