来自 蓝颜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;