123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- {
- This file is part of the Free Component Library
- JSON Data structure to TValue conversion
- Copyright (c) 2022 by Michael Van Canneyt [email protected]
- See the file COPYING.FPC, included in this distribution,
- for details about the copyright.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- **********************************************************************}
- unit fpjsonvalue;
- {$mode ObjFPC}{$H+}
- interface
- uses
- fpjson, rtti;
- function ValueToJSON(const aValue: TValue; aType: TRttiType): TJSONData;
- function JSONToValue(aData: TJSONData; aType: TRttiType): TValue;
- Implementation
- uses typinfo;
- function ValueToJSON(const aValue: TValue; aType: TRttiType): TJSONData;
- var
- i: SizeInt;
- at: TRttiDynamicArrayType;
- begin
- Result := Nil;
- try
- case aType.TypeKind of
- tkAString,
- tkUString,
- tkWString,
- tkSString:
- Result := TJSONString.Create(aValue.AsUnicodeString);
- tkInteger:
- Result := TJSONIntegerNumber.Create(aValue.AsInteger);
- tkInt64,
- tkQWord:
- Result := TJSONInt64Number.Create(aValue.AsInt64);
- tkBool:
- Result := TJSONBoolean.Create(aValue.AsBoolean);
- tkDynArray: begin
- Result := TJSONArray.Create;
- at := aType as TRttiDynamicArrayType;
- for i := 0 to aValue.GetArrayLength - 1 do
- TJSONArray(Result).Add(ValueToJSON(aValue.GetArrayElement(i), at.ElementType));
- end;
- { ToDo: further types }
- end;
- except
- Result.Free;
- Raise;
- end;
- end;
- function JSONToValue(aData: TJSONData; aType: TRttiType): TValue;
- var
- _as: AnsiString;
- us: UnicodeString;
- i: Integer;
- i64: Int64;
- b: Boolean;
- arr: TJSONArray;
- varr: array of TValue;
- at: TRttiDynamicArrayType;
- begin
- varr:=[];
- Result := TValue.Empty;
- case aType.TypeKind of
- tkAString: begin
- _as := aData.AsString;
- TValue.Make(@_as, PTypeInfo(aType.Handle), Result);
- end;
- tkUString: begin
- us := aData.AsUnicodeString;
- TValue.Make(@us, PTypeInfo(aType.Handle), Result);
- end;
- tkInteger: begin
- i := aData.AsInteger;
- TValue.Make(@i, PTypeInfo(aType.Handle), Result);
- end;
- tkInt64,
- tkQWord: begin
- i64 := aData.AsInt64;
- TValue.Make(@i64, PTypeInfo(aType.Handle), Result);
- end;
- tkBool: begin
- b := aData.AsBoolean;
- TValue.Make(@b, PTypeInfo(aType.Handle), Result);
- end;
- tkDynArray: begin
- arr := aData as TJSONArray;
- at := aType as TRttiDynamicArrayType;
- SetLength(varr, arr.Count);
- for i := 0 to High(varr) do
- varr[i] := JSONToValue(arr[i], at.ElementType);
- Result := TValue.FromArray(aType.Handle, varr);
- end;
- { ToDo: further types }
- end;
- end;
- end.
|