开发者

JUST SHARE - MySQL DataSet into Json Format using delphi SuperObject [closed]

It's difficult to tell what is being asked here. This question is ambiguous, vague, incomplete, overly broad, or rhetorical and cannot be reasonably answered in its current form. For help clarifying this question so that it can be reopened, visit the help center. Closed 11 years ago.

Just share my experience开发者_JAVA百科 using Json using Delphi SuperObject

The idea is how to convert my query result into json format easily.

I use string to represent all data format (including BLOB, DATE, DATETIME). In future the json file can be imported into database easily.

I do not write the code from scratch, i just made a little modification suited into my own need

Here is the code :

function TTableJSon.CreateJsonValueByFieldMySql(Json: ISuperObject;
  Field: TField): Boolean;
var
  JsonTyp, FieldTyp : string;
  tmpStr : string;
begin
  Result := False;
  if Field Is TDateField then begin
      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 is TMemoField then begin
      Json.S[Field.FieldName] := EncodeString(Field.AsString)
  end else if Field is TBlobField then begin
      Json.S[Field.FieldName] := EncodeString(Field.AsString)
  end else if Field is TFloatField then begin
      Json.O[Field.FieldName] := SO(ReplaceStr(Field.AsString,',','.'))
  end else begin
        Json.O[Field.FieldName] := SO(Field.Value);
  end;
  Result := True;
end;


function TTableJSon.JSonFromDataSet(DataSet: TDataSet): string;
  procedure GetFieldTypeInfo(Field:TField;var Fieldtyp,JsonTyp:string);
  begin
      Fieldtyp := GetEnumName(TypeInfo(TFieldType),ord(Field.DataType));
      Delete(Fieldtyp,1,2);
      if Field is TStringField then
        JsonTyp := 'string'
      else if Field is TDateTimeField then
        JsonTyp := 'integer'
      else if Field is TMemoField then
        JsonTyp := 'memo'
      else if Field is TBlobField then
        JsonTyp := 'blob'
      else if (Field is TIntegerField) or (Field is TLargeintField) then
        JsonTyp := 'integer'
      else if Field is TCurrencyField then
        JsonTyp := 'currency'
      else if Field is TNumericField then
        JsonTyp := 'double'
      else if Field is TBooleanField then
        JsonTyp := 'boolean'
      else
        JsonTyp := 'variant';
  end;

var
  sj,aj,sj2:ISuperObject;
  i:Integer;
  Fieldtyp,JsonTyp:string;
  List:TStringList;
begin
  sj := SO();
  aj := SA([]);
  List := TStringList.Create;
  try
      List.Sorted := True;

      for i := 0 to DataSet.FieldCount - 1 do
      begin
        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);
      end;
      sj.O['Cols'] := aj;
      DataSet.DisableControls;

      DataSet.First;
      aj := SA([]);
      while not DataSet.Eof do
      begin
        sj2 := SO();
        for i := 0 to DataSet.FieldCount - 1 do
        begin
          if VarIsNull(DataSet.Fields[i].Value) then
            sj2.O[DataSet.Fields[i].FieldName] := SO(Null)
          else begin
            CreateJsonValueByFieldMySql(sj2,DataSet.Fields[i]);
          end;
        end;
        aj.AsArray.Add(sj2);
        DataSet.Next;
      end;
      sj.O['Data'] := aj;

      Result := sj.AsString;
  finally
      List.Free;
      DataSet.EnableControls;
  end;

end;
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜