json - 在 Datasnap (Delphi 10) 中旋转数据集 JSON 结果

标签 json delphi datasnap delphi-10-seattle

我正在尝试旋转使用 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 方法来直接添加新对象。我很确定这段代码还有很多其他错误。

有人可以指导我如何解决它吗?

最佳答案

把它放在 Web 模块中

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":[{...},{...}]}

关于json - 在 Datasnap (Delphi 10) 中旋转数据集 JSON 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36741255/

相关文章:

objective-c - 来自iOS asihttprequest的Delphi XE2 DataSnap REST处理参数

delphi - DataSnap 是将现有 Windows 应用程序的数据和业务逻辑引入移动/Web 客户端的合适解决方案吗?

json - 如何将对象流式传输到 gzipped json?

ruby-on-rails - 如何使用渲染 json : with active-model-serializers gem?

delphi - 项目中文件的设计类属性是什么?

delphi - 从 Delphi 访问包含 VT_RECORD 的 VT_ARRAY 的 OleVariant

php - MySQL JSON 设置

json - Jolt 变换 - 如何用字段值重命名字段?

delphi - 使用运行时包编译的应用程序的单元最终确定顺序?

Delphi DataSnap函数返回TStream和内存泄漏