2016-04-20 15 views
1

Ich versuche, das Ergebnis der Datasnap Datasnap zu drehen.Drehen eines Datensatzes JSON Ergebnis in Datennap (Delphi 10)

Beispiel: Das ist, was ich

{"result":[{"table":[["REG_KEY",1,0,0,2,3,0,0,false,false,0,false,false],["REG_NAME",1,1,0,128,129,0,0,false,false,0,false,false]],"REG_KEY":["01","02"],"REG_NAME":["BALEARES","CANARIAS"]}]} 

bekommen Und ich will es zu transformieren, um nur:

[{"REG_KEY":"01","REG_NAME":"BALEARES"},{"REG_KEY":"02","REG_NAME":"CANARIAS"}] 

Ich beabsichtige, sie zu transformieren im DSHTTPWebDispatcher.FormatResult, aber ist mein erstes Mal mit DataSnap/REST/JSON und ich habe Probleme zu verstehen, die Klassen JSON-Werte zu verwalten.

Es sollte wie folgt sein:

procedure TWebModule1.DSHTTPWebDispatcher1FormatResult(Sender: TObject; var ResultVal: TJSONValue; const Command: TDBXCommand; var Handled: Boolean); 
var 
    Aux: TJSONObject; 
    NewResult: TJSONObject; 
    Row: TJSONObject; 
    NumField, NumRow, MaxFields, MaxRows: integer; 
begin 
    Handled := True; 
    NewResult := TJSONArray.Create; 
    Aux := TJSONArray(ResultVal).Get(0); // I get the result as an Object instead of an Array 
    MaxFields := Aux.Pairs.Count - 1; // I ignore the Pair 0 because it only contains the Dataset structure 
    MaxRows := TJSONArray(1).Count; 
    for NumRow := 0 to MaxRows - 1 do begin 
     Row := TJSONObject.Create; 
     for NumField := 1 to MaxFields do begin 
      Row.AddPair(Aux.Pairs[NumField].JsonString, 
         TJSONArray(Aux.Pairs[NumField].JsonValue).Get(NumRow)); 
     end; 
     Aux.Add(Row); 
    end; 
    Aux.Free; 
    ResultVal.Free; 
    ResultVal := NewResult; 
end; 

Aber die TJSONObject keinen Pairs.Count Methode zu wissen, wie viele Paare enthält, und die TJSONArray nicht über und Methode In den direkt hinzufügen ein neues Objekt. Ich bin mir ziemlich sicher, dass dieser Code viele andere Fehler hat.

Kann mir jemand sagen, wie ich es beheben kann?

Antwort

2

Ich habe es :-)

Dieser Code führt die Transformation Ich suchte (es hat eine doppelte Schleife durch Zeilen und Spalten laufen, und es dreht sich um das Ergebnis in einem neuen JSON):

procedure TWebModule1.DSHTTPWebDispatcher1FormatResult(Sender: TObject; var ResultVal: TJSONValue; const Command: TDBXCommand; var Handled: Boolean); 
var Aux: TJSONObject; 
    NewResult: TJSONValue; 
    Row: TJSONObject; 
    NumField, NumRow, MaxFields, MaxRows: integer; 
begin 
    Handled := True; 

    if ResultVal.ToJSON = '[{"table":[]}]' then begin 
    TJSONArray(ResultVal).Remove(0); 
    end 
    else if (LowerCase(Copy(ResultVal.ToJSON, 1, 10)) = '[{"table":') then begin // For Datasets I rotate its content so it comes as rows and not as columns 
    NewResult := TJSONArray.Create; 
    Aux := TJSONObject(TJSONArray(ResultVal).Get(0)); 

    MaxFields := Aux.Count - 1; // I ignore the Pair 0 because it only contains the Dataset structure 
    MaxRows := TJSONArray(TJSONPair(Aux.Get(1)).JSONValue).Count; 

    for NumRows := 0 to MaxRows - 1 do begin 
     Row := TJSONObject.Create; 
     for NumFields := 1 to MaxFields do begin 
     Row.AddPair(Aux.Pairs[NumField].JsonString.Value, 
        TJSONArray(Aux.Pairs[NumField].JsonValue).Get(NumRow).Clone as TJSONValue); 
     end; 
     TJSONArray(NewResult).AddElement(Row); 
    end; 

    ResultVal.Free;    // I free the old Result because a new one is returned (Aux is already supposed to be freed when freeing ResultVal) 
    ResultVal := NewResult;  
    end; 
end; 
2

dieses Modul in Web diese

{"result":[{...},{...}]} 
procedure TWebModule1.DSHTTPWebDispatcher1FormatResult(Sender: TObject; 
var ResultVal: TJSONValue; const Command: TDBXCommand; 
       var Handled: Boolean); 
var 
    Aux: TJSONValue; 
begin 
    Aux := ResultVal; 
    ResultVal := TJSONArray(Aux).Get(0); 
    TJSONArray(Aux).Remove(0); 
    Aux.Free; 
end; 

Ihr Ergebnis wird

setzen
+0

Danke, aber das ist nicht genau das, was ich gesucht habe. Ich muss das Ergebnis rotieren, indem ich jeden Datensatz als Elemente des Hauptarrays erhalte, während Datasnap jedes Feld als anderes Array mit seinen Werten zurückgibt: [{"REG_KEY": "01", "REG_NAME": "BALEARES"}, {"REG_KEY": "02", "REG_NAME": "CANARIAS"}] anstelle von: ["REG_KEY": ["01", "02"], "REG_NAME": ["BALEARES", " CANARIAS "]}] –