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