Delphi XE7 Datasnap采用纯JSON

Mag*_*gno 5 java delphi json 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;
Run Code Online (Sandbox Code Playgroud)

一切都很好,"the_list()"将从我的选择中获得所有需要的数据,最后我将得到结果.一些Java客户端将连接访问类似的内容:http:// localhost:8080/datasnap/rest/Tws/listJSON/123

为了试一试,我安装了名为Advanced Rest Client的Chrome扩展程序,我得到了这样的结果:

{"list":"QURCUw4AAADGAQAA\/wABAAH\/Av8DBAAO...."} 
Run Code Online (Sandbox Code Playgroud)

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

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

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

bsw*_*bsw 2

我认为它不会起作用,我假设您需要 Delphi 单元才能使用 FireDacJsonreflect。

您可以自己制作 Json 输出,请参阅这个小示例,我使用示例 DB 中的 comany 仅在 clientdataset 中使用 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;
Run Code Online (Sandbox Code Playgroud)

这应该给出类似的结果

{“结果”:[{“字段”:[{“字段0”:“客户编号”},{“字段1”:“公司”},{“字段2”:“国家”}],“记录1”:[ {"0":"1221"},{"1":"可爱岛潜水专柜"},{"2":"美国"}],"record-2":[{"0":"1231"}, {"1":"Unisco"},{"2":"巴哈马"}],"record-3":[{"0":"1351"},{"1":"视觉潜水员"},{ "2":"塞浦路斯"}],"record-4":[{"0":"1354"},{"1":"开曼潜水世界无限"},{"2":"英属西印度群岛" }],"record-5":[{"0":"1356"},{"1":"汤姆索亚潜水中心"},{"2":"美属维尔京群岛"}],"record-6 ":[{"0":"1380"},{"1":"Blue Jack Aqua Center"},{"2":"美国"}],"record-7":[{"0":" 1384"},{"1":"VIP 潜水俱乐部"},{"2":"美属维尔京群岛"}],"record-8":[{"0":"1510"},{"1" :"海洋天堂"},{"2":"美国"}],"record-9":[{"0":"1513"},{"1":"Fantastique Aquatica"},{"2" :"哥伦比亚"}],"record-10":[{"0":"1551"},{"1":"Marmot Divers Club"},{"2":"加拿大"}],"record- 11":[{"0":"1560"},{"1":"深水炸弹"},{"2":"美国"}],"record-12":[{"0":"第1563章潜水俱乐部"},{"2":"美国"}],"record-14":[{"0":"1645"},{"1":"行动俱乐部"},{"2":" US"}],"record-15":[{"0":"1651"},{"1":"牙买加潜水中心"},{"2":"西印度群岛"}],"record-16 ":[{"0":"1680"},{"1":"岛屿探索者"},{"2":"美国"}],"record-17":[{"0":"1984" },{"1":"海底冒险"}