【问题标题】:Rotate a Dataset JSON Result in Datasnap (Delphi 10)在 Datasnap (Delphi 10) 中旋转数据集 JSON 结果
【发布时间】:2016-04-20 10:38:32
【问题描述】:

我正在尝试旋转使用 Datasnap 返回的数据集的结果。

示例:这就是我得到的

{"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"]}]}

我想将其转换为:

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

我打算在 DSHTTPWebDispatcher.FormatResult 中对其进行转换,但这是我第一次使用 DataSnap/REST/JSON,我无法理解管理 JSON 值的类。

应该是这样的:

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;

但是 TJSONObject 没有 Pairs.Count 方法来知道包含多少对,并且 TJSONArray 没有 Add 方法来直接添加新对象。我很确定这段代码还有很多其他错误。

谁能指导我如何解决它?

【问题讨论】:

    标签: json delphi datasnap delphi-10-seattle


    【解决方案1】:

    把它放到网络模块中

    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;
    

    你的结果会是这样的

    {"result":[{...},{...}]}
    

    【讨论】:

    • 谢谢,但这并不是我想要的。我需要旋转结果,将每条记录作为主数组的元素,而 Datasnap 将每个字段作为具有其值的不同数组返回:[{"REG_KEY":"01","REG_NAME":"BALEARES"},{" REG_KEY":"02","REG_NAME":"CANARIAS"}] 而不是:["REG_KEY":["01","02"],"REG_NAME":["BALEARES","CANARIAS"]}]
    【解决方案2】:

    我明白了:-)

    这段代码完成了我寻找的转换(它执行了一个遍历行和列的双循环,并将结果旋转到一个新的 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;
    

    【讨论】:

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