2015-05-19 9 views
5

Ich habe diese:Delphi XE7 DataSnap mit reinem 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; 

alles in Ordnung „the_list()“ werden alle benötigten Daten von meinem wählen bekommen und schließlich werde ich das Ergebnis haben. Einige Java-Clients eine Verbindung herstellen Zugriff auf so etwas wie: http://localhost:8080/datasnap/rest/Tws/listJSON/123

Um einen Versuch zu machen, installierte ich eine Chrome-Erweiterung Erweiterte REST-Client genannt, und ich erhalte ein solches Ergebnis:

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

nach einige Änderungen in TWebModule1.DSHTTPWebDispatcher1FormatResult();

Es scheint eine komprimierte JSON-Daten zu sein und soweit ich weiß, kann Java damit umgehen, aber ich bin mir nicht sicher, und ich würde eine unkomprimierte und reine JSON-Ausgabe bevorzugen. Ich weiß, dass die Verwendung von mORMOt den Trick leisten kann, aber ich würde es gerne versuchen, denn um mORMOT zu verwenden, sollten wir viel lernen.

Ist es möglich, das reine JSON auszugeben, indem Sie RAD Datasnap server verwenden? Vielleicht ist alles absolut korrekt und ich weiß es einfach nicht ...

+0

Hey, hast du ein Erfolg? Ich habe das gleiche Problem. –

+0

Verwenden Sie immer noch XE7? Ich habe mit XE7 dafür aufgehört und vielleicht könnte die neueste Version das tun. – Magno

Antwort

2

Ich glaube nicht, dass es funktioniert, ich nehme an, Sie brauchen Delphi-Einheiten, um FireDacJsonreflect zu verwenden.

Sie könnten der Json Ausgang selbst machen, finden Sie in diesem kleinen Beispiel I comany aus Beispiel verwenden DB nur 3-Feld in einem ClientDataSet, werden Sie probobly machen es ein wenig komplizierter, und auch eine andere structur Ich denke,

nur eine Idee ..

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; 

Dies ein Ergebnis wie

{ "Ergebnis" geben soll: [{ "Fields": [{ "Field0": "CustNo"}, { "Field1":“ Firma "}, {" Field2 ":" Land "}]," record-1 ": [{" 0 ":" 1221 "}, {" 1 ":" Kauai Dive Shoppe "}, {" 2 ": US "}]," reco rd-2 ": {{" 0 ":" 1231 "}, {" 1 ":" Unisco "}, {" 2 ":" Bahamas "}]," record-3 ": [{" 0 ": 1351 "}, {" 1 ":" Sight Diver "}, {" 2 ":" Zypern "}]," record-4 ": [{" 0 ":" 1354 "}, {" 1 ":" Cayman Divers World Unlimited "}, {" 2 ":" Britische Antillen "}," record-5 ": [{" 0 ":" 1356 "}, {" 1 ":" Tom Sawyer Diving Center "}, { "2": "Amerikanische Jungferninseln"}], "record-6": [{"0": "1380"}, {"1": "Blue Jack Aqua Center"}, {"2": "US" }], "record-7": [{"0": "1384"}, {"1": "VIP Divers Club"}, {"2": "Amerikanische Jungferninseln"}], "record-8" : [{"0": "1510"}, {"1": "Ozean-Paradies"}, {"2": "US"}], "record-9": [{"0": "1513"} , {"1": "Fantastique Aquatica"}, {"2": "Columbia"}], "record-10": [{"0": "1551"}, {"1": "Marmot Divers Club" }, {"2": "Kanada"}], "record-11": [{"0": "1560"}, {"1": "Die Tiefenladung"}, {"2": "US" }], "record-12": [{"0": "1563"}, {"1": "Blauer Sport"}, {"2": "US"}], "record-13": [{ "0": "1624"}, {"1": "Makai SCUBA Club"}, {"2": "USA"}], "record-14": [{"0": "1645"}, { "1": "Action Club"}, {"2": "US"}], "record-15": [{"0": "1651"}, {"1": "Jamaika SCUBA Center"}, {"2": "Westindische Inseln"}], "record-16": [{"0": "1680"}, {"1": "Inselfinder"} , { "2": "US"}], "record-17": [{ "0": "1984"}, { "1": "Abenteuer Undersea"}

+0

Danke. Ich werde es auf der Grundlage Ihres Vorschlags versuchen und hier berichten. – Magno

+0

Hallo, ein anderer Weg ist es, eine Klasse zu erstellen und sie mit Daten zu füllen und die Klasse nach Json zu exportieren, einen Blick auf diesen Link werfen. http://firemonkeytutorial.com/using-model-view-viewmodel-mvvm-delphi-firemonkey/ und diese http://blogs.embarcadero.com/stephenball/2014/06/05/how-to-convert-an- Objekt-zu-JSON-und-zurück-mit-einer-Zeile-of-code / – bsw

0
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;