Delphi XE7 Datasnap с чистым JSON

У меня есть это:

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

Чтобы попробовать, я установил расширение Chrome под названием Advanced Rest Client и получил такой результат:

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

после внесения некоторых изменений в TWebModule1.DSHTTPWebDispatcher1FormatResult();

Кажется, это сжатые данные JSON, и, насколько я знаю, Java может с этим справиться, но я не уверен, и я бы предпочел несжатый и чистый вывод JSON. Я знаю, что с помощью mORMOt можно добиться цели, но я хотел бы попробовать, так как для использования mORMOt мы должны многому научиться.

Возможно ли это сделать, вывести чистый JSON, используя сервер RAD Datasnap? Может быть, все абсолютно правильно, и я просто не знаю...


person Magno    schedule 19.05.2015    source источник
comment
Эй, у тебя есть какие-нибудь успехи? У меня такая же проблема.   -  person henrique romao    schedule 21.09.2016
comment
Вы все еще используете XE7? Из-за этого я ушел с XE7, и, возможно, самая новая версия могла бы справиться с этой задачей.   -  person Magno    schedule 26.09.2016


Ответы (1)


Я не думаю, что это сработает, я предполагаю, что вам нужны модули Delphi для использования 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;

Это должно дать результат, подобный

{"результат":[{"Поля":[{"Поле0":"Заказ №"},{"Поле1":"Компания"},{"Поле2":"Страна"}],"запись-1":[ {"0":"1221"},{"1":"Kauai Dive Shoppe"},{"2":"США"}],"запись-2":[{"0":"1231"}, {"1":"Unisco"},{"2":"Багамы"}],"record-3":[{"0":"1351"},{"1":"Sight Diver"},{ "2":"Кипр"}],"record-4":[{"0":"1354"},{"1":"Cayman Divers World Unlimited"},{"2":"Британская Вест-Индия" }],"запись-5":[{"0":"1356"},{"1":"Дайвинг-центр Тома Сойера"},{"2":"Виргинские острова США"}],"запись-6 ":[{"0":"1380"},{"1":"Аквацентр Блю Джек"},{"2":"США"}],"запись-7":[{"0":" 1384"},{"1":"VIP Divers Club"},{"2":"Виргинские острова США"}],"record-8":[{"0":"1510"},{"1" :"Ocean Paradise"},{"2":"США"}],"record-9":[{"0":"1513"},{"1":"Fantastique Aquatica"},{"2" :"Колумбия"}],"запись-10":[{"0":"1551"},{"1":"Marmot Divers Club"},{"2":"Канада"}],"запись- 11":[{"0":"1560"},{"1":"Глубинная бомба"},{"2":"США"}],"запись-12":[{"0":" 1563"},{"1":"Blue Sports"},{"2":"США"}],"запись-13":[{"0":"1624"},{"1":"Макаи SCUBA Club"},{"2":"США"}],"рекорд-14":[{"0":"1645"},{"1 ":"Action Club"},{"2":"США"}],"запись-15":[{"0":"1651"},{"1":"Центр подводного плавания на Ямайке"},{" 2":"Вест-Индия"}],"record-16":[{"0":"1680"},{"1":"Искатели островов"},{"2":"США"}]," запись-17":[{"0":"1984"},{"1":"Подводное приключение"}

person bsw    schedule 22.05.2015
comment
Спасибо. Я попробую, основываясь на вашем предложении, и сообщу здесь. - person Magno; 22.06.2015
comment
Привет, еще один способ - создать класс, заполнить его данными и экспортировать класс в Json. Взгляните на эту ссылку. firemonkeytutorial.com/ и этот blogs.embarcadero.com/stephenball/2014/06/05/ - person bsw; 23.06.2015