Ich bin nicht durch den Quelltext gegangen, aber ein Synonym für ein leeres Array [] ist tatsächlich nil
. Nicht dass hier unbeabsichtigt irgendeine Optimierung greift und der entsprechende Serialisierungsmechanismus tatsächlich einen Nullpointer bekommt...
Wenn man in
TJson.ProcessOptions
reinschaut, dann ist an der folgenden kommentiert-markierten Stelle für mein leeres Array der Typ von LPair.JsonValue nicht TJSONArray sondern TJSONNull.
Delphi-Quellcode:
class procedure TJson.ProcessOptions(AJsonObject: TJSOnObject; AOptions: TJsonOptions);
var
LPair: TJSONPair;
LItem: TObject;
i: Integer;
function IsEmpty(ASet: TJsonOptions):boolean;
var
LElement: TJsonOption;
begin
Result := true;
for LElement in ASet do
begin
Result := false;
break;
end;
end;
begin
if assigned(AJsonObject) and not isEmpty(AOptions) then
for i := AJsonObject.Count -1 downto 0 do
begin
LPair := TJSONPair(AJsonObject.Pairs[i]);
if LPair.JsonValue is TJSOnObject then
TJson.ProcessOptions(TJSOnObject(LPair.JsonValue), AOptions)
else if LPair.JsonValue is TJSONArray then // <------- hier beginnt meine Fahrt zur Hölle! LPair.JsonValue ist für ein leeres dynamisches Array von Typ TJsonNull!
begin
if (joIgnoreEmptyArrays in AOptions) and (TJSONArray(LPair.JsonValue).Count = 0) then
begin
AJsonObject.RemovePair(LPair.JsonString.Value).DisposeOf;
end
else
for LItem in TJSONArray(LPair.JsonValue) do
begin
if LItem is TJSOnObject then
TJson.ProcessOptions(TJSOnObject(LItem), AOptions)
end;
end
else
begin
if (joIgnoreEmptyStrings in AOptions) and (LPair.JsonValue.value = '') then
begin
AJsonObject.RemovePair(LPair.JsonString.Value).DisposeOf;
end;
end;
end;
end;