嗯,这是一个试验性的收费产品,它是做为 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;