zoukankan      html  css  js  c++  java
  • DataSet Json 转化

    来自 蓝颜2756215016

    function DataSetToJson(ADataSet: TClientDataSet; All: Boolean): ISuperObject;
    var
      i: Integer;
      json: ISuperObject;
      f: TField;
      ws: WideString;
    begin
      if ADataSet.State in [dsEdit,dsInsert] then ADataSet.Post;
      if All then
      begin
        Result := TSuperObject.Create(stArray);
        ADataSet.First;
        while not ADataSet.Eof do
        begin
          json := TSuperObject.Create(stObject);
          for i := 0 to ADataSet.FieldCount -1 do
          begin
            f := ADataSet.Fields[i];
            if f.FieldKind <> fkData then Continue;
            if not f.IsNull then
            begin
              case f.DataType of
                ftString:
                  begin
                    ws := f.AsString;
                    json.S[LowerCase(f.FieldName)] := ws;
                  end;
    
                ftBoolean:
                  json.B[LowerCase(f.FieldName)] := f.AsBoolean;
                ftInteger:
                  json.I[LowerCase(f.FieldName)] := f.AsInteger;
                ftFloat:
                  json.D[LowerCase(f.FieldName)] := f.AsFloat;
                ftDate,ftDateTime:
                  json.I[LowerCase(f.FieldName)] := DelphiToJavaDateTime(f.AsDateTime);
              else
                 begin
                    ws := f.AsString;
                    json.S[LowerCase(f.FieldName)] := ws;
                  end;
              end;
            end;
          end;
          Result.AsArray.Add(json);
          ADataSet.Next;
        end;
      end   
      else begin
        json := TSuperObject.Create(stObject);
        for i := 0 to ADataSet.FieldCount -1 do
        begin
          f := ADataSet.Fields[i];
          if not f.IsNull then
          begin
            case f.DataType of
              ftString:
                begin
                  ws := f.AsString;
                  json.S[LowerCase(f.FieldName)] := ws;
                end;
              ftBoolean:
                json.B[LowerCase(f.FieldName)] := f.AsBoolean;
              ftInteger:
                json.I[LowerCase(f.FieldName)] := f.AsInteger;
              ftFloat:
                json.D[LowerCase(f.FieldName)] := f.AsFloat;
              ftDate,ftDateTime:
                json.I[LowerCase(f.FieldName)] := DelphiToJavaDateTime(f.AsDateTime);
            else
              begin
                ws := f.AsString;
                json.S[LowerCase(f.FieldName)] := ws;
              end;
            end;
          end;
        end;
        Result := json;
      end;
    end;
    procedure JsonToDataSet(AJson: ISuperObject;ADataSet: TClientDataSet);
      procedure setFieldValue(f:TField;val: ISuperObject);
      var
        vReadOnly: Boolean;
        OldEvent: TFieldNotifyEvent;
      begin
        vReadOnly := f.ReadOnly;
        f.ReadOnly := false;
        OldEvent := f.OnChange;
        f.OnChange := nil;
        try
          case f.DataType of
            ftString: f.AsString := val.AsString;
            ftInteger: f.AsInteger := val.AsInteger;
            ftBoolean: f.AsBoolean := val.AsBoolean;
            ftFloat: f.AsFloat := val.AsDouble;
            ftDate,ftDateTime: f.AsDateTime := JavaToDelphiDateTime(val.AsInteger);
            else
              f.AsString := val.AsString;
          end;
        finally
          f.ReadOnly := vReadOnly;
          f.OnChange := OldEvent;
        end;
      end;
    var
      item: TSuperObjectIter;
      json: ISuperObject;
      jsonArr: TSuperArray;
      i: integer;
      AChildDataSet: TLDataSet;
      vReadOnly: Boolean;
    begin
      vReadOnly := ADataSet.ReadOnly;
      ADataSet.ReadOnly := False;
      item.Ite := nil;
      try
        if AJson.DataType = stArray then
        begin
          jsonArr := AJson.AsArray;
          ADataSet.DisableControls;
          for i := 0 to jsonArr.Length -1 do
          begin
            json := jsonArr.O[i];      
            ADataSet.Append;
            if ObjectFindFirst(json, item) then
            repeat
              if (ADataSet.FindField(item.key) <> nil) and
               (item.val.DataType <> stNull) then
                setFieldValue(ADataSet.FieldByName(item.key),item.val);
            until not ObjectFindNext(item);
            ADataSet.Post;
          end;
          ADataSet.EnableControls;
        end
        else begin
          json := AJson;
          ADataSet.Append;
          if ObjectFindFirst(json, item) then
          repeat
            if (ADataSet.FindField(item.key) <> nil) and
             (item.val.DataType <> stNull) then
            begin
              setFieldValue(ADataSet.FieldByName(item.key),item.val);
            end;         
    
          until not ObjectFindNext(item);
          ADataSet.Post;
        end;
      finally
        ADataSet.ReadOnly := vReadOnly;
        if item.Ite <> nil then
          ObjectFindClose(item);
      end;
    end;
    
  • 相关阅读:
    你应该知道的77条 Windows 7小技巧
    Platform Builder: Build Tools Intro
    JavaScript面向对象编程实现研究
    优秀驾驶员开车技巧
    WinCE BSP中的Dirs文件和Sources文件
    WinCE BSP中的Dirs文件和Sources文件
    WIX资源
    男性减肥方法!!!!!(转)
    Platform Builder: Sources.cmn
    批处理中的字符串处理详解
  • 原文地址:https://www.cnblogs.com/jialiguo/p/3478097.html
Copyright © 2011-2022 走看看