Je travaille avec un serveur de repos Delphi XE DataSnap et j'essaie de renvoyer un objet Serialized JSON. Le résultat que ma méthode renvoie au client ressemble à ceci: json bien formé. P> Le problème est que lorsque le message est reçu par le client, il y a Un tas de trucs ajoutés à celui-ci et on dirait que ceci: p> {"result": ["{\"type\":\"ServerMethodsUnit1.TJSONIssue\",
\"id\":1,
\"fields\":{
\"FIssueNo\":90210,
\"FTitle\":\"Beverly Hills...that's where I want to be\",
\"FKind\":\"Wishlist\"}
}
"
]
}
3 Réponses :
Utilisez-vous un bureau Delphi en tant que client? Si oui peut-être que vous pouvez essayer d'autres retours de votre méthode car Delphi fait une conversion automatiquement de tout type de retour à JSON P>
Par exemple: retourner un dbxreader sera converti en type JSON P>
Si vous avez un autre client (PHP, Java, Flex), je ne peux pas vous aider. J'ai le même problème ..J'ai créé une méthode pour recevoir un paramètre JSONOBJECT en tant que paramètre et j'ai fait un code PHP Simplex pour appeler cette méthode ... J'ai créé une classe d'objet et passez-la ..in le serveur, il ne peut pas convertir JSONOBJECT en objet ... L'erreur se produit lorsque lamarshall exécute .. p>
Mes tests fonctionnent simplement avec des types primitifs! p>
Le JSON que vous avez affiché RAPRESENT a résultat pour une méthode distante qui renvoie une chaîne, pas un JSONObject. La bonne façon de renvoyer un JSONOOBJECT doit être la suivante (non compilée / testée):
function TMyRemote.GetSomething: TJSONValue; begin Result := TJSONObject.Create; Result.Add("Name","Daniele Teti"); //used the overloaded version of add (string, string) end;
Pour vous débarrasser de exemple. J'ai un code comme celui-ci: p> réponse de service de repos ressemble à ceci: i Ajouter "Résultat" Code> Tag Vous devez utiliser
OnFormatresult CODE> Evénement de
TDSHTTPWebDisPatcher code>. Especialy la valeur
traitée code>. La valeur de
traitée code> est
false code> par défaut. Si défini sur
true code>, le résultat transmis à l'utilisateur ne sera pas emballé dans un
"résultat" code> objet JSON. S'il est faux, il sera enveloppé dans cet objet.
{"résultat": [{"nom": "asdfasdf"}]} Code> p>
Manipulé: = TRUE; CODE>: P>
procedure TWebModule1.DSHTTPWebDispatcher1FormatResult(Sender: TObject;
var ResultVal: TJSONValue; const Command: TDBXCommand; var Handled: Boolean);
var
Aux: TJSONValue;
begin
//remove [] element
Aux := ResultVal;
ResultVal := TJSONArray(Aux).Items[0];
TJSONArray(Aux).Remove(0);
Aux.Free;
//we do not need "result" tag
Handled := true;
end;
On dirait que tu fais un double json? Les caractères d'évacuation (la barre oblique backslash) sont standard pour les chaînes JSON.