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;