diff --git a/src/DataSet.Serialize.Export.pas b/src/DataSet.Serialize.Export.pas index 802497a..ce92e12 100644 --- a/src/DataSet.Serialize.Export.pas +++ b/src/DataSet.Serialize.Export.pas @@ -305,7 +305,9 @@ function TDataSetSerialize.DataSetToJSONObject(const ADataSet: TDataSet; const A else Result.{$IF DEFINED(FPC)}Add{$ELSE}AddPair{$ENDIF}(LKey, TJSONString.Create(FormatFloat(TDataSetSerializeConfig.GetInstance.Export.FormatFloat, LField.AsFloat))); end; - TFieldType.ftString, TFieldType.ftWideString, TFieldType.ftMemo, TFieldType.ftWideMemo, TFieldType.ftGuid, TFieldType.ftFixedChar, TFieldType.ftFixedWideChar: + TFieldType.ftGuid: + Result.{$IF DEFINED(FPC)}Add{$ELSE}AddPair{$ENDIF}(LKey, TJSONString.Create(LField.AsWideString)); + TFieldType.ftString, TFieldType.ftWideString, TFieldType.ftMemo, TFieldType.ftWideMemo, TFieldType.ftFixedChar, TFieldType.ftFixedWideChar: begin LStringValue := Trim(LField.AsWideString); if TDataSetSerializeConfig.GetInstance.Export.TryConvertStringToJson then diff --git a/src/DataSet.Serialize.pas b/src/DataSet.Serialize.pas index 21259da..112a1f5 100644 --- a/src/DataSet.Serialize.pas +++ b/src/DataSet.Serialize.pas @@ -151,6 +151,23 @@ TDataSetSerializeHelper = class Helper for TDataSet /// procedure LoadFromJSON(const AJSONObject: TJSONObject; const AOwns: Boolean = True); overload; /// + /// Loads the DataSet with data from a JSON object. + /// + /// + /// Refers to JSON that you want to load. + /// + /// + /// Elemento raiz do JSON + /// + /// + /// Destroy JSON in the end. + /// + /// + /// Only the keys that make up the DataSet field list will be loaded. The JSON keys must have the same name as the + /// DataSet fields. It's not case-sensitive. + /// + procedure LoadFromJSON(const AJSONObject: TJSONObject; const ARootElement: string = ''; const AOwns: Boolean = True); overload; + /// /// Loads the DataSet with data from a JSON array. /// /// @@ -170,11 +187,14 @@ TDataSetSerializeHelper = class Helper for TDataSet /// /// Refers to JSON that you want to load. /// + /// + /// Elemento raiz do JSON + /// /// /// Only the keys that make up the DataSet field list will be loaded. The JSON keys must have the same name as the /// DataSet fields. It's not case-sensitive. /// - procedure LoadFromJSON(const AJSONString: string); overload; + procedure LoadFromJSON(const AJSONString: string; const ARootElement: string = ''); overload; /// /// Updates the DataSet data with JSON object data. /// @@ -326,10 +346,32 @@ procedure TDataSetSerializeHelper.LoadFromJSON(const AJSONArray: TJSONArray; con end; procedure TDataSetSerializeHelper.LoadFromJSON(const AJSONObject: TJSONObject; const AOwns: Boolean = True); +begin + LoadFromJSON(AJSONObject, EmptyStr, AOwns); +end; + +procedure TDataSetSerializeHelper.LoadFromJSON(const AJSONObject: TJSONObject; const ARootElement: string = ''; const AOwns: Boolean = True); var + LJSON: TJSONValue; LJSONSerialize: TJSONSerialize; begin - LJSONSerialize := TJSONSerialize.Create(AJSONObject, AOwns); + if ARootElement.Trim.IsEmpty then + LJSONSerialize := TJSONSerialize.Create(AJSONObject, AOwns) + else + begin + try + LJSON := AJSONObject.FindValue(ARootElement); + if not Assigned(LJSON) then + raise Exception.Create('Root element not found!'); + if LJSON.InheritsFrom(TJSONArray) then + LJSONSerialize := TJSONSerialize.Create(LJSON.Clone as TJSONArray, True) + else + LJSONSerialize := TJSONSerialize.Create(LJSON.Clone as TJSONObject, True); + finally + if AOwns then + AJSONObject.Free; + end; + end; try LJSONSerialize.ToDataSet(Self); finally @@ -369,10 +411,10 @@ function TDataSetSerializeHelper.ValidateJSON(const AJSONString: string; const A Result := TJSONArray.Create(); end; -procedure TDataSetSerializeHelper.LoadFromJSON(const AJSONString: string); +procedure TDataSetSerializeHelper.LoadFromJSON(const AJSONString: string; const ARootElement: string = ''); begin if Trim(AJSONString).StartsWith('{') then - LoadFromJSON({$IF DEFINED(FPC)}GetJSON(AJSONString){$ELSE}TJSONObject.ParseJSONValue(TEncoding.UTF8.GetBytes(AJSONString), 0){$ENDIF} as TJSONObject) + LoadFromJSON({$IF DEFINED(FPC)}GetJSON(AJSONString){$ELSE}TJSONObject.ParseJSONValue(TEncoding.UTF8.GetBytes(AJSONString), 0){$ENDIF} as TJSONObject, ARootElement) else if Trim(AJSONString).StartsWith('[') then LoadFromJSON({$IF DEFINED(FPC)}GetJSON(AJSONString){$ELSE}TJSONObject.ParseJSONValue(TEncoding.UTF8.GetBytes(AJSONString), 0){$ENDIF} as TJSONArray); end;