6
votes

Delphi DataSnap Framework Ajouter des trucs au message JSON

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: xxx pré>

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\"}
             }
            "
           ]
}


1 commentaires

On dirait que tu fais un double json? Les caractères d'évacuation (la barre oblique backslash) sont standard pour les chaînes JSON.


3 Réponses :


2
votes

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

Par exemple: retourner un dbxreader sera converti en type JSON

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 ..

Mes tests fonctionnent simplement avec des types primitifs!


0 commentaires

4
votes

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;


0 commentaires

7
votes

Pour vous débarrasser de "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.

exemple. J'ai un code comme celui-ci: p> xxx pré>

réponse de service de repos ressemble à ceci: {"résultat": [{"nom": "asdfasdf"}]} Code> p>

i Ajouter 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;


0 commentaires