只是分享我使用Delphi SuperObject使用Json的经验
这个想法是如何轻松地将我的查询结果转换为 json 格式。
我使用字符串来表示所有数据格式(包括 BLOB、DATE、DATETIME)。将来可以轻松地将 json 文件导入数据库。
我不是从头开始编写代码,我只是做了一些适合自己需要的修改
这是代码:
函数 TTableJSon.CreateJsonValueByFieldMySql(Json: ISuperObject; 字段:TField):布尔值; 变量 JsonTyp,FieldTyp:字符串; tmpStr : 字符串; 开始 结果:=错误; 如果字段是 TDateField 然后开始 Json.O[Field.FieldName] := SO('"'+FormatDateTime('yyyy-mm-dd',Field.AsDateTime)+'"') end else if Field Is TDateTimeField then begin Json.O[Field.FieldName] := SO('"'+FormatDateTime('yyyy-mm-dd hh:nn:ss',Field.AsDateTime)+'"') end else if Field 是 TMemoField 然后开始 Json.S[Field.FieldName] := EncodeString(Field.AsString) end else if Field 是 TBlobField 然后开始 Json.S[Field.FieldName] := EncodeString(Field.AsString) end else if Field 是 TFloatField 然后开始 Json.O[Field.FieldName] := SO(ReplaceStr(Field.AsString,',','.')) 结束否则开始 Json.O[Field.FieldName] := SO(Field.Value); 结尾; 结果:=真; 结尾; 函数TTableJSon.JSonFromDataSet(数据集:TDataSet):字符串; 过程 GetFieldTypeInfo(Field:TField;var Fieldtyp,JsonTyp:string); 开始 Fieldtyp := GetEnumName(TypeInfo(TFieldType),ord(Field.DataType)); 删除(字段类型,1,2); 如果 Field 是 TStringField 那么 JsonTyp := '字符串' 否则如果 Field 是 TDateTimeField 那么 JsonTyp := '整数' 否则如果 Field 是 TMemoField 那么 JsonTyp := '备忘录' 否则如果 Field 是 TBlobField 那么 JsonTyp := 'blob' else if (Field is TIntegerField) 或 (Field is TLargeintField) then JsonTyp := '整数' 否则如果 Field 是 TCurrencyField 那么 JsonTyp := '货币' 否则如果 Field 是 TNumericField 那么 JsonTyp := '双' 否则如果 Field 是 TBoleanField 那么 JsonTyp := '布尔值' 别的 JsonTyp := '变体'; 结尾; 变量 sj,aj,sj2:ISuperObject; 我:整数; 字段类型,JsonTyp:字符串; 列表:TStringList; 开始 sj := SO(); aj := SA([]); 列表:= TStringList.Create; 尝试 List.Sorted := 真; 对于 i := 0 到 DataSet.FieldCount - 1 做 开始 sj2 := SO(); GetFieldTypeInfo(DataSet.Fields[i],Fieldtyp,JsonTyp); sj2.S[cstFieldName] := DataSet.Fields[i].FieldName; sj2.S[cstFieldType] := Fieldtyp; sj2.S[cstJsonType] := JsonTyp; sj2.I[cstFieldSize] := DataSet.Fields[i].Size; sj2.B[cstRequired] := DataSet.Fields[i].Required; sj2.I[cstFieldIndex] := DataSet.Fields[i].Index; aj.AsArray.Add(sj2); List.Add(DataSet.Fields[i].FieldName+'='+JsonTyp); 结尾; sj.O['Cols'] := aj; 数据集.DisableControls; 数据集.First; aj := SA([]); 而不是 DataSet.Eof 做 开始 sj2 := SO(); 对于 i := 0 到 DataSet.FieldCount - 1 做 开始 如果 VarIsNull(DataSet.Fields[i].Value) 那么 sj2.O[DataSet.Fields[i].FieldName] := SO(Null) 否则开始 CreateJsonValueByFieldMySql(sj2,DataSet.Fields[i]); 结尾; 结尾; aj.AsArray.Add(sj2); 数据集.Next; 结尾; sj.O['Data'] := aj; 结果:= sj.AsString; 最后 列表。免费; 数据集.EnableControls; 结尾; 结尾;