【问题标题】:Delphi XE7 Datasnap with pure JSON带有纯 JSON 的 Delphi XE7 Datasnap
【发布时间】:2015-05-19 20:14:38
【问题描述】:

我有这个:

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?也许一切都是绝对正确的,我只是不知道......

【问题讨论】:

  • 嘿,你成功了吗?我有同样的问题。
  • 你还在用XE7吗?为此我放弃了 XE7,也许最新版本可以完成这项工作。

标签: java json delphi datasnap


【解决方案1】:

我认为它不会起作用,我假设您需要 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;

这应该给出类似的结果

{"result":[{"Fields":[{"Field0":"CustNo"},{"Field1":"Company"},{"Field2":"Country"}],"record-1 ":[{"0":"1221"},{"1":"可爱岛潜水专卖店"},{"2":"美国"}],"record-2":[{"0":"1231 "},{"1":"Unisco"},{"2":"巴哈马"}],"record-3":[{"0":"1351"},{"1":"Sight Diver" },{"2":"Cyprus"}],"record-4":[{"0":"1354"},{"1":"Cayman Divers World Unlimited"},{"2":"英国西印度群岛"}],"record-5":[{"0":"1356"},{"1":"汤姆索亚潜水中心"},{"2":"美属维尔京群岛"}]," record-6":[{"0":"1380"},{"1":"Blue Jack Aqua 中心"},{"2":"US"}],"record-7":[{"0 ":"1384"},{"1":"VIP 潜水俱乐部"},{"2":"美属维尔京群岛"}],"record-8":[{"0":"1510"},{ "1":"海洋天堂"},{"2":"US"}],"record-9":[{"0":"1513"},{"1":"Fantastique Aquatica"},{ "2":"哥伦比亚"}],"record-10":[{"0":"1551"},{"1":"旱獭潜水俱乐部"},{"2":"加拿大"}], "record-11":[{"0":"1560"},{"1":"The Depth Charge"},{"2":"US"}],"record-12":[{"0 ":"1563"},{"1":"Blue Sports"},{"2":"US"}],"record-13":[{"0":"1624"},{"1" :"魔界潜水俱乐部"},{"2":"US"}],"record-14":[{"0":"1645"}, {"1":"Action Club"},{"2":"US"}],"record-15":[{"0":"1651"},{"1":"牙买加潜水中心"} ,{"2":"西印度群岛"}],"record-16":[{"0":"1680"},{"1":"Island Finders"},{"2":"US"} ],"record-17":[{"0":"1984"},{"1":"海底探险"}

【讨论】:

【解决方案2】:
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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多