【问题标题】:Delphi XE6 FireDAC - Export TFDQuery recordset to JSONDelphi XE6 FireDAC - 将 TFDQuery 记录集导出为 JSON
【发布时间】:2015-10-11 02:17:42
【问题描述】:

我在 Delphi XE6 中使用 FireDAC 通过 ODBC 查询数据库(Pervasive)。我有一个 TFDQuery 组件,它运行我的 SELECT 查询并返回记录。查询完成后,我想将记录集中的数据导出为 JSON。我试过使用以下代码:

fdacQuery.SaveToStream(myStream, sfJSON);

这会创建 JSON,但仅用于表定义,即字段名称、数据类型、约束等 - 没有数据的表示。我应该使用另一种方法将记录集数据导出为 JSON 吗?还有其他解决方案吗?

【问题讨论】:

  • 您是否更改了ResourceOptions.StoreItems 属性?
  • 您好,感谢您的提示 - 我现在将该属性设置为 [siData] 已更改结果但仍然没有数据。我现在得到以下 JSON: {"FDBS":{"Version":11,"Manager":{"TableList":[{"class":"Table","Name":"Customers","SourceID ":1,"RowList":[]}]}}}

标签: json delphi delphi-xe6 firedac


【解决方案1】:

你看过http://docwiki.embarcadero.com/RADStudio/XE8/en/Tutorial:_Using_a_REST_DataSnap_Server_with_an_Application_and_FireDAC教程中的代码了吗?

// Create dataset list
Result := TFDJSONDataSets.Create;
// Add departments dataset
TFDJSONDataSetsWriter.ListAdd(Result, sDepartment, FDQueryDepartment);
// Add employees dataset
TFDJSONDataSetsWriter.ListAdd(Result, sEmployees, FDQueryDepartmentEmployees);

【讨论】:

  • 您好,感谢您的回复。我看过那个教程,但我认为它对我没有帮助,因为 TFDJSONDataSets 对象返回带有 mime 编码二进制内容的 JSON 数据。这意味着RAD studio需要在两端使用,而我想支持所有客户端和平台。
【解决方案2】:

那么试试这个尺寸。我是为昨天需要的实用程序做的。它使用超级对象。我在代码中保留了所有字段类型,以防您想添加其他特殊处理或调整我输入的任何内容。它现在适用于许多随机数据集。

class procedure TTool.ExportDataSetToJson(DataSet: TDataSet; FileName: string; Append: boolean = false);
const
  SData = 'data';
var
  json : ISuperObject;
  item : ISuperObject;
  wasActive: boolean;
  fld : TField;
begin
  json := SO;
  json.O[SData] := SA([]);
  wasActive := DataSet.Active;
  try
    DataSet.Active := true;
    DataSet.First;
    while not DataSet.Eof do
    begin
      item := SO;
      for fld in DataSet.Fields do
      begin
        case fld.DataType of
//          ftUnknown: ;
          ftString,
          ftBlob,
          ftMemo,
          ftFmtMemo,
          ftBytes,
          ftVarBytes,
          ftFixedChar,
          ftFixedWideChar,
          ftWideMemo,
          ftByte,
          ftWideString: item.S[fld.FieldName] := fld.AsString;
          ftBoolean: item.B[fld.FieldName] := fld.AsBoolean;
          ftFloat,
          ftSingle,
          ftExtended,
          ftCurrency,
          ftFMTBcd,
          ftBCD: item.D[fld.FieldName] := fld.AsFloat;
          ftTime : item.S[fld.FieldName] := TimeToJson(fld.AsDateTime);
          ftDate,
          ftTimeStamp,
          ftOraTimeStamp,
          ftDateTime: item.S[fld.FieldName] := DateTimeToJson(fld.AsDateTime);
          ftSmallint,
          ftInteger,
          ftWord,
          ftAutoInc,
          ftLongWord,
          ftShortint,
          ftLargeInt: item.I[fld.FieldName] := fld.AsLargeInt;
//          ftGraphic: ;
//          ftParadoxOle: ;
//          ftDBaseOle: ;
//          ftTypedBinary: ;
//          ftCursor: ;
//          ftADT: ;
//          ftArray: ;
//          ftReference: ;
//          ftDataSet: ;
//          ftOraBlob: ;
//          ftOraClob: ;
//          ftVariant: ;
//          ftInterface: ;
//          ftIDispatch: ;
          ftGuid: item.S[fld.FieldName] := fld.AsString;
//          ftOraInterval: ;
//          ftConnection: ;
//          ftParams: ;
//          ftStream: ;
//          ftTimeStampOffset: ;
//          ftObject: ;
          else
            item.S[fld.FieldName] := fld.AsString;
        end;
      end;
      DataSet.Next;
      json.A[SData].Add(item);
    end;
    if Append then
      TFile.AppendAllText(FileName, json.AsJSon(true, true))
    else
      json.SaveTo(FileName, true, true);
  finally
    DataSet.Active := wasActive;
  end;

end;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-10
    相关资源
    最近更新 更多