只是分享我使用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;
结尾;
结尾;