Show quoted text 8 lines
On Oct 17, 2022, at 2:48 PM, Michael Van Canneyt via fpc-pascal wrote:
Small follow-up:
If you want to extend it, you can find the necessary code in the restbase
unit. It already implements the necessary code to (de)stream arrays, plus
some other enhancements as well. It's on my TODO list to merge the
implementations taking TJSONStreamer as a base, but if you are busy with this maybe you can provide a patch...
I probably don’t know enough about the library to do this well or quickly enough. This is what I hacked together but it only works on the 2 array types I need and I may not have done this correctly even.
function TLSPStreamer.StreamProperty(Const AObject: TObject; PropertyInfo: PPropInfo): TJSONData;
type
TVariantArray = array of Variant;
TObjectArray = array of TObject;
var
PropArray: TJSONArray;
ElementType: PTypeInfo;
VariantArray: TVariantArray;
ObjectArray: TObjectArray;
i: integer;
begin
Result := nil;
if PropertyInfo^.PropType^.Kind = tkDynArray then
begin
// Class kinds are in ElType2 (not sure why)
ElementType := GetTypeData(PropertyInfo^.PropType)^.ElType;
if ElementType = nil then
ElementType := GetTypeData(PropertyInfo^.PropType)^.ElType2;
PropArray := TJSONArray.Create;
case ElementType^.Kind of
tkVariant:
begin
VariantArray := TVariantArray(GetDynArrayProp(AObject, PropertyInfo));
for i := 0 to High(VariantArray) do
PropArray.Add(StreamVariant(VariantArray[i]));
Result := PropArray;
end;
tkClass:
begin
ObjectArray := TObjectArray(GetDynArrayProp(AObject, PropertyInfo));
for i := 0 to High(ObjectArray) do
PropArray.Add(StreamClassProperty(ObjectArray[i]));
result := PropArray;
end;
otherwise
raise EUnknownErrorCode.Create('Dynamic array element type "'+Integer(ElementType^.Kind).ToString+'" is not supported for responses.');
end;
end
else
Result := inherited StreamProperty(AObject, PropertyInfo);
end;
Regards,
Ryan Joseph