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;