[付费]数据集内容输出 JSON 格式数据

嗯,这是一个试验性的收费产品,它是做为 TQJsonOutputChannel 的附属品存在的,信赖于 qjson_output_channel 单元,提供数据集转换为 JSON 数据内容的格式化输出支持。收费标准定为 200 元,含源码、示例和用法一对一指导。

【使用方法】

一如既往的简单,直接引用 qjson_dataset 单元,然后就可以调用 IQJsonEncoder 的 WriteElement/WriteChild 方法,写入一个数据集对象的内容了。

【输出格式】

输出的 JSON 数据支持两种格式和额外两种控制选项:

格式1:常规格式(DSF_STYLE_NORMAL)

[{"user_name":"test","age":18,"sex":true },{"user_name":"qdac","age":20, "sex":false}]

格式2:精简格式(DSF_STYLE_PACKED)

{"names":["user_name","age","sex"],"rows":[["test",18,true],["qdac",20,false]]}

要自定义输出格式的选项,可以在 WriteElement/WriteChild 的附加以下参数:

  • flags : 输出格式标志,可以是 DSF_STYLE_PACKED(使用精简格式)/DSF_CAMELIZED(使用驼峰格式转换数据集字段名)/DSF_NULLABLE(空值是否赋值为null,仅在常规模式下有意义,精简模式下因为字段顺序匹配要求,必需保留对应值)
  • rowsKey : 对应于精简格式下,记录列表结点的名称
  • fieldsKey : 对应于精简格式下,字段列表结点的名称

【示例代码】

procedure TForm2.SpeedButton6Click(Sender: TObject);
var
  AWriter: IQJsonStreamEncoder;
  AStream: TStream;
  ADataSet: TADODataSet;
  AJson: TQJson;
  AOptions: Integer;
begin
  ADataSet := TADODataSet.Create(nil);
  ADataSet.FieldDefs.Add('user_name', ftString, 20);
  ADataSet.FieldDefs.Add('age', ftInteger);
  ADataSet.FieldDefs.Add('sex', ftBoolean);
  ADataSet.CreateDataSet;
  ADataSet.Append;
  ADataSet.Fields[0].AsString := 'test';
  ADataSet.Fields[1].AsInteger := 18;
  ADataSet.Fields[2].AsBoolean := true;
  ADataSet.Post;
  ADataSet.Append;
  ADataSet.Fields[0].AsString := 'qdac';
  ADataSet.Fields[1].AsInteger := 20;
  ADataSet.Fields[2].AsBoolean := false;
  ADataSet.Post;
  AJson := TQJson.Create;
  AStream := TMemoryStream.Create;
  if chkLazyWrite.Checked then
    AWriter := TQJsonOutputChannel.CreateEncoder(teUtf8, AStream,
      true, 32, 8192)
  else
    AWriter := TQJsonOutputChannel.CreateEncoder(teUtf8, AStream, true);
  try
    if CheckBox1.Checked then
      AOptions := DSF_STYLE_PACKED
    else
      AOptions := 0;
    if chkCamelize.Checked then
      AOptions := AOptions + DSF_CAMELIZED;
    if chkCustomKey.Checked then
      AWriter.WriteElement(ADataSet, [AWriter.NewParam('flags', AOptions),
        AWriter.NewParam('rowsKey', 'records'), AWriter.NewParam('fieldsKey',
        'fields')])
    else
      AWriter.WriteElement(ADataSet, [AWriter.NewParam('flags', AOptions)]);
    AWriter.Flush;
    AStream.Position := 0;
    AJson.LoadFromStream(AStream);
    ShowMessage(AJson.AsJson);
  finally
    FreeAndNil(AStream);
    FreeAndNil(AJson);
    FreeAndNil(ADataSet);
  end;
end;
滚动至顶部