Einzelnen Beitrag anzeigen

TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.060 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: REST.Json.TJson serialisiert "falsch" leere dyn. Arrays?

  Alt 2. Mär 2017, 18:01
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;
  Mit Zitat antworten Zitat