Delphi FDQuery转JSON

ecbunoof  于 2024-01-07  发布在  其他
关注(0)|答案(6)|浏览(356)

我试图将我的Sqlite查询的结果转换为JSON,以使用与我通过PHP远程绑定到SQL Server相同的过程。
代码工作,但你认为这是一个更好的解决方案?
有人这样做吗?

  1. function TLogin.RetornaRegistros(query:String): String;
  2. var
  3. FDQuery : TFDQuery;
  4. field_name,nomeDaColuna,valorDaColuna : String;
  5. I: Integer;
  6. begin
  7. FDQuery := TFDQuery.Create(nil);
  8. try
  9. FDQuery.Connection := FDConnection1;
  10. FDQuery.SQL.Text := query;
  11. FDQuery.Active := True;
  12. FDQuery.First;
  13. result := '[';
  14. while (not FDQuery.EOF) do
  15. begin
  16. result := result+'{';
  17. for I := 0 to FDQuery.FieldDefs.Count-1 do
  18. begin
  19. nomeDaColuna := FDQuery.FieldDefs[I].Name;
  20. valorDaColuna := FDQuery.FieldByName(nomeDaColuna).AsString;
  21. result := result+'"'+nomeDaColuna+'":"'+valorDaColuna+'",';
  22. end;
  23. Delete(result, Length(Result), 1);
  24. result := result+'},';
  25. FDQuery.Next;
  26. end;
  27. FDQuery.Refresh;
  28. Delete(result, Length(Result), 1);
  29. result := result+']';
  30. finally
  31. FDQuery.Free;
  32. end;
  33. end;

字符串

zengzsys

zengzsys1#

这不是一个好办法。我真的建议考虑至少三个选择:
1.使用System.JSON单元的强大功能。

  1. Uses {...} System.JSON;
  2. Var
  3. FDQuery : TFDQuery;
  4. field_name,Columnname,ColumnValue : String;
  5. I: Integer;
  6. LJSONObject:TJsonObject;
  7. begin
  8. FDQuery := TFDQuery.Create(nil);
  9. try
  10. FDQuery.Connection := FDConnection1;
  11. FDQuery.SQL.Text := query;
  12. FDQuery.Active := True;
  13. FdQuery.BeginBatch;//Don't update external references until EndBatch;
  14. FDQuery.First;
  15. LJSONObject:= TJSONObject.Create;
  16. while (not FDQuery.EOF) do
  17. begin
  18. for I := 0 to FDQuery.FieldDefs.Count-1 do
  19. begin
  20. ColumnName := FDQuery.FieldDefs[I].Name;
  21. ColumnValue := FDQuery.FieldByName(ColumnName).AsString;
  22. LJSONObject.AddPair(TJSONPair.Create(TJSONString.Create( ColumnName),TJSONString.Create(ColumnValue)));
  23. FDQuery.Next;
  24. end;
  25. //FDQuery.Refresh; that's wrong
  26. FdQuery.EndBatch;
  27. finally
  28. FDQuery.Free;
  29. Showmessage(LJSonObject.ToString);
  30. end;
  31. end;

个字符
1.第二种方法,使用FDMemTable.SaveToStream; * 同样适用于FDMemTable.SaveToFile;* 将TFDMemTable放在数据表(或表单)上。

  1. fMStream:TMemoryStream;
  2. Begin
  3. FDQuery := TFDQuery.Create(nil);
  4. try
  5. FDQuery.Connection := FDConnection1;
  6. FDQuery.SQL.Text := query;
  7. FDQuery.Active := True;
  8. //fdMemTable1.Data:=fdQuery.Data; {note *2}
  9. fdMemTable1.CloneCursor(FdQuery,true,true);{note *3}
  10. fMStream:=TMemoryStream.Create;
  11. FdMemTable1.SaveToStream(fMStream,sfJson);
  12. finally
  13. FDQuery.Free;
  14. FdMemTable.Close;
  15. end;


现在您可以阅读JSON内容
例如,下面的答案Converting TMemoryStream to 'String' in Delphi 2009

  1. function MemoryStreamToString(M: TMemoryStream): string;
  2. begin
  3. SetString(Result, PChar(M.Memory), M.Size div SizeOf(Char));
  4. end;


json是String
1.该BatchMove由@ davaMarotoSilva发布
你可以使用BatchMove组件,它提供了一个在数据集之间移动数据的接口,但是当你想以驱动器、XML或JSON格式保存数据时,它更适合备份和导入。我还没有找到在内存中使用数据移动的例子;如果有人有例子,请评论。

备注

1.使用FdMemTable时,不要忘记拖动TFDStanleyJSONLink组件进行数据Map
1.方法。Data只适用于FiredacDatasets(前缀为FD的Datasets)。要为旧Datasets中的memTable分配数据,请使用方法.Copydata。
1.抱歉,我将.Data更改为.CloneCursor,以便与两个数据集共享相同的内存空间。

展开查看全部
sy5wg1nm

sy5wg1nm2#

我只是修改了我下面的第一个答案,以comport不同类型的字段转换为适当的json格式的数字,日期和布尔值。我注解了我没有测试的类型。看

使用{...} System.JSON;

  1. Var
  2. FDQuery : TFDQuery;
  3. field_name, Columnname, ColumnValue : String;
  4. I: Integer;
  5. LJSONObject:TJsonObject;
  6. begin
  7. FDQuery := TFDQuery.Create(nil);
  8. try
  9. FDQuery.Connection := FDConnection1;
  10. FDQuery.SQL.Text := query;
  11. FDQuery.Active := True;
  12. FdQuery.BeginBatch;//Don't update external references until EndBatch;
  13. FDQuery.First;
  14. LJSONObject:= TJSONObject.Create;
  15. while (not FDQuery.EOF) do
  16. begin
  17. for I := 0 to FDQuery.FieldDefs.Count-1 do
  18. begin
  19. ColumnName := FDQuery.FieldDefs[I].Name;
  1. Case FDQuery.FieldDefs[I].Datatype of
  2. ftBoolean:
  3. IF FDQuery.FieldDefs[I].Value=True then LJSONObject.AddPair(TJSONPair.Create(TJSONString.Create( ColumnName),TJSONTrue.Create)) else
  4. LJSONObject.AddPair(TJSONPair.Create(TJSONString.Create( ColumnName),TJSONFalse.Create));
  5. ftInteger,ftFloat{,ftSmallint,ftWord,ftCurrency} :
  6. LJSONObject.AddPair(TJSONPair.Create(TJSONString.Create( ColumnName),TJSONNumber.Create(FDQuery.FieldDefs[I].value)));
  7. ftDate,ftDatetime,ftTime:
  8. LJSONObject.AddPair(TJSONPair.Create(TJSONString.Create( ColumnName),TJSONString.Create(FDQuery.FieldDefs[I].AsString)));
  9. //or TJSONString.Create(formatDateTime('dd/mm/yyyy',FDQuery.FieldDefs[I].Value));
  10. else LJSONObject.AddPair(TJSONPair.Create(TJSONString.Create( ColumnName),TJSONString.Create(FDQuery.FieldDefs[I].AsString)));
  11. End;
  1. FDQuery.Next;
  2. end;
  3. FdQuery.EndBatch;
  4. finally
  5. FDQuery.Free;
  6. Showmessage(LJSonObject.ToString);
  7. end;
  8. end;

关于数据集的更多信息。DataType http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/DB_TFieldType.html
更多关于JSONTypes https://community.embarcadero.com/blogs/entry/json-types-for-server-methods-in-datasnap-2010-4

展开查看全部
fnx2tebb

fnx2tebb3#

考虑使用TFDBatchMove组件。它用于在两个数据库之间直接传输数据,并支持额外的Map。作为源和目标,可以是文本,数据集或对任何FireDAC支持的数据库引擎的SQL查询。

cngwdvgl

cngwdvgl4#

Delphi MVC Framework包含一个强大的Map器,可以将jsonMap到对象,将数据集Map到对象。Mapper是一个子项目。它是独立的代码,也可以用于其他类型的项目。它是开源的!
优点是布尔值,例如,被转换为TJSONBool类型,而不是字符串。我建议看看示例。
https://github.com/danieleteti/delphimvcframework/tree/master/samples/objectsmapperssamples

rdrgkggo

rdrgkggo5#

这可能不是最好的解决方案,你可以修改它来格式化JSON.这里有一个快速的示例解决方案:

  1. function GetDataSetAsJSON(DataSet: TDataSet): TJSONObject;
  2. var
  3. f: TField;
  4. o: TJSOnObject;
  5. a: TJSONArray;
  6. begin
  7. a := TJSONArray.Create;
  8. DataSet.Active := True;
  9. DataSet.First;
  10. while not DataSet.EOF do begin
  11. o := TJSOnObject.Create;
  12. for f in DataSet.Fields do
  13. o.AddPair(f.FieldName, VarToStr(f.Value));
  14. a.AddElement(o);
  15. DataSet.Next;
  16. end;
  17. DataSet.Active := False;
  18. Result := TJSONObject.Create;
  19. Result.AddPair(DataSet.Name, a);
  20. end;

字符串

展开查看全部
xqkwcwgp

xqkwcwgp6#

我喜欢它的简单性,有了JsonDataObjects的强大功能,我们可能会得到JsonObject的结果。
使用.. JsonDataObjects,

  1. function GetDataSetAsJSON(DataSet: TDataSet): JsonDataObjects.TJSONObject;
  2. var
  3. F: TField;
  4. JDO : JsonDataObjects.TJSONObject;
  5. begin
  6. Result := TJsonObject.Create;
  7. DataSet.Active := True;
  8. DataSet.First;
  9. while not DataSet.EOF do
  10. begin
  11. // automatic object creation, 'ResultData' is the owner of JDO
  12. JDO := Result.A['ResultData'].AddObject();
  13. for F in DataSet.Fields do
  14. JDO.S[F.FieldName] := VarToStr(F.Value);
  15. DataSet.Next;
  16. end;
  17. DataSet.Active := False;
  18. end;

字符串

展开查看全部

相关问题