6

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

结尾;
4

0 回答 0