Einzelnen Beitrag anzeigen

Benutzerbild von t2000
t2000

Registriert seit: 15. Dez 2005
Ort: NRW
212 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Replace JSON Escape Steuerzeichen

  Alt 19. Mär 2020, 16:13
Klar, hier mal ein konkretes Beispiel:

Ich nutze TMS XData Framework für meine REST Kommunikation
Auf Serverseite habe ich folgende REST-Funktion

function TMeineFunc.CheckSvcRunning(const Param: TJSONObject) : TJSONObject; Diese wird aufgerufen und von dort möchte ich als erstes den Parameter überprüfen und in mein eigenes TsngParameter-Object überführen.
Ich rufe also die Create-Routine direkt mit den erhaltenen Daten auf.

Die Daten lauten (Beispiel) STRG-F7 -> AParam.toString ->
'{"Function":"CheckSvcRunning","Version":"10000"," Data":"{\"Services\":[\"75CBA3B2-0970-4278-9170-AEE6920587B1\",\"75CBA3B2-0970-4278-9170-AEE6920587B1\"]}"}'

Die Funktion sollte das gleiche Ergebnis liefern, wenn die gesamten Daten nochmals in {"Param":{...}} gekapselt wären. Daher die ersten Zeilen im Create Constructor

Man sieht, dass das interne Objekt die Backslashes hat. Die direkte Erstellung hat die Exception geliefert. Der Umweg über den String funktioniert aber.

Hier nochmal der ganze Code:

Delphi-Quellcode:
const
  sngType_ExceptionResult = 'Exception';
  sngTypeJSONName_Parameter = 'Param';
  sngTypeJSONName_Parameter_sngFunction = 'Function';
  sngTypeJSONName_Parameter_Version = 'Version';
  sngTypeJSONName_Parameter_JSONData = 'Data';

constructor TsngParameter.Create( const AParam: TJSONObject);
var
  LParam: TJSONObject;
  FJSONDataString: String;
begin
  try
    // Wenn das JSON in einem Parameter-Feld enthalten ist, dann auspacken, falls nicht, direkt zugreifen
    if AParam.GetValue( sngTypeJSONName_Parameter) <> nil then
      LParam := AParam.GetValue<TJSONObject>( sngTypeJSONName_Parameter)
    else
      LParam := AParam;

    FsngFunction := LParam.GetValue<string>( sngTypeJSONName_Parameter_sngFunction);
    FVersion := LParam.GetValue<string>( sngTypeJSONName_Parameter_Version);
    SetVersionCode(FVersion);

    //FJSONData := LParam.GetValue<TJSONObject>( sngTypeJSONName_Parameter_JSONData); Exception bei \"
    FJSONDataString := LParam.GetValue<string>( sngTypeJSONName_Parameter_JSONData);
    //FJSONDataString := ReplaceJSONEscape(FJSONDataString); nicht notwendig
    FJSONData := TJSONObject.ParseJSONValue( FJSONDataString) as TJSONObject;

  except
    on e: Exception do begin
      FsngFunction := sngType_ExceptionResult;
      FVersion := e.Message;
      FJSONData := nil;
    end;
  end;
end;
Thomas
(Wir suchen eine(n) Entwickler(in) mit Ambitionen später ggf. die Softwarefirma zu leiten)
Aktuell nicht mehr. Aber ab vielleicht 2024/2025 wird das wieder sehr interessant!
  Mit Zitat antworten Zitat