带纯JSON的Delphi XE7 Datasnap

我有这个:

function TWS.listJSON(const id: integer): TJSONObject;
var LDataSets: TFDJSONDataSets;
begin
    LDataSets := the_list(id); //the_list:TFDJSONDataSets
    try
       Result := TJSONObject.Create;
       TFDJSONInterceptor.DataSetsToJSONObject(LDataSets, Result);
    finally
       LDataSets.Free;
   end;
end;

一切正常,“the_list()”将从我的选择中获得所有需要的数据,最后我会得到结果。 一些Java客户端将连接访问类似于:http:// localhost:8080 / datasnap / rest / Tws / listJSON / 123

为了试一下,我安装了一个名为Advanced Rest Client的Chrome扩展,并且我得到了这样的结果:

{"list":"QURCUw4AAADGAQAA/wABAAH/Av8DBAAO...."} 

在TWebModule1.DSHTTPWebDispatcher1FormatResult()中进行一些更改后;

它似乎是一个压缩的JSON数据,据我所知,Java可以处理,但我不确定,我更喜欢一个未压缩的纯JSON输出。 我知道使用mORMOt可以做到这一点,但我想尝试一下,至于使用mORMOt我们应该学到很多东西。

是否有可能通过使用RAD Datasnap服务器来输出纯JSON? 也许一切都是绝对正确的,我只是不知道...


我认为它不会奏效,我假设你需要使用德尔福单位来使用FireDacJsonreflect。

你可以自己创建Json输出,看到这个小例子,我使用客户数据集中的示例数据库只有3字段的公有语言,你可能会使它更复杂一点,也是我猜测的另一个结构

只是一个想法..

function TServerMethods1.JsonDB: TJSONObject;  // Hold the array
var
i      : Integer;
JsonArray: TJSONArray;
record_number : Integer;

begin
 result:=TJSONObject.Create;

 // Field names
 JsonArray:=TJSONArray.Create;
 ClientDataSet1.First;
 for i := 0 to ClientDataSet1.Fields.Count-1 do
 Begin
  JsonArray.AddElement(TJSONObject.Create(TJSONPair.Create('Field'+I.ToString    ,ClientDataSet1.Fields[i].FieldName)));
 End;
  Result.AddPair('Fields',JsonArray);

//Data
 record_number:=0;
 while not ClientDataSet1.Eof  do
 Begin
   inc(record_number);
   JsonArray:=TJSONArray.Create;
   for i := 0 to ClientDataSet1.Fields.Count-1 do
   Begin
     JsonArray.AddElement(TJSONObject.Create(TJSONPair.Create(I.ToString,ClientD    ataSet1.Fields[i].Asstring)));
   End;
   Result.AddPair('record-'+record_number.ToString,JsonArray);
   ClientDataSet1.Next;
 End;

end;

这应该会给出类似的结果

{ “结果”:[{ “字段”:[{ “Field0”: “CustNo”},{ “字段1”: “公司”},{ “字段2”: “国家”}], “记录1”:[ {“0”:“1221”},{“1”:“考爱岛潜水专柜”},{“2”:“美国”}],“记录-2”:[{“0”:“1231” {“1”:“Unisco”},{“2”:“巴哈马”}],“记录-3”:[{“0”:“1351”},{“1” “2”:“塞浦路斯”}],“记录-4”:[{“0”:“1354”},{“1”:“Cayman Divers World Unlimited”},{“2” }],“record-5”:[{“0”:“1356”},{“1”:“Tom Sawyer潜水中心”},{“2”:“美属维尔京群岛”}] “:[{”0“:”1380“},{”1“:”Blue Jack Aqua Center“},{”2“:”US“}],”record-7“:[{”0“:” “记录8”:[{“0”:“1510”},{“1”:“VIP潜水员俱乐部”},{“2”:“美属维尔京群岛”}} :“海洋乐园”},{“2”:“美国”}],“记录-9”:[{“0”:“1513”},{“1”:“Fantastique Aquatica”},{“2” :“哥伦比亚”}},“记录10”:[{“0”:“1551”},{“1”:“Marmot潜水员俱乐部”},{“2”:“加拿大”}] 11“:[{”0“:”1560“},{”1“:”深度冲锋“},{”2“:”美国“}],”记录12“:[{”0“:” “记录13”:[{“0”:“1624”},{“1”:“Makai SCUBA Club“},{”2“:”US“}],”record-14“:[{”0“:”1645“},{”1 “:”行动俱乐部“},{”2“:”美国“}],”记录15“:[{”0“:”1651“},{”1“:”牙买加潜水中心“ 2“:”西印度群岛“}],”记录16“:[{”0“:”1680“},{”1“:”岛屿发现者“},{”2“:”美国“}] record-17“:[{”0“:”1984“},{”1“:”冒险海底“}


procedure TWebModuleServer.DSHTTPWebDispatcher1FormatResult(Sender: TObject;
  var ResultVal: TJSONValue; const Command: TDBXCommand; var Handled: Boolean);
var
JSONValue: TJSONValue;
begin
  if Command.Text = 'TServerMethodsServer.GetVendas' then
    begin
      Handled := True;
      JSONValue := ResultVal;
      ResultVal := TJSONArray(JSONValue).Get(0);
      TJSONArray(JSONValue).Remove(0);
      JSONValue.Free;
    end;
end;
链接地址: http://www.djcxy.com/p/64685.html

上一篇: Delphi XE7 Datasnap with pure JSON

下一篇: Change a FireDAC query SQL string from DataSnap client