IHttpActionResult avec chaîne JSON
J'ai une méthode qui à l'origine a renvoyé un HttpResponseMessage
et je voudrais convertir ce retour IHttpActionResult
.
Mon problème est que le code actuel est l'aide de JSON.Net pour sérialiser un complexe générique structure de l'arbre, ce qui n'est bien à l'aide d'un custom JsonConverter
j'ai écrit le code fonctionne bien).
Voici de quoi il en retourne:
string json = NodeToJson(personNode);
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK);
response.Content = new StringContent(json, Encoding.UTF8, "application/json");
return response;
La NodeToJson méthode est où la coutume convertisseur est en jeu ...
private static string NodeToJson(Node<Person> personNode) {
var settings = new JsonSerializerSettings {
Converters = new List<JsonConverter> { new OrgChartConverter() },
Formatting = Formatting.Indented
};
return JsonConvert.SerializeObject(personNode, settings);
}
Remarque cette fonction retourne une string
, au format JSON.
Si je passe ce IHttpActionResult
, il semble échouer, indépendamment de ce que j'essaie. Je peux juste laisser (il fonctionne) mais je suis censé être en utilisant les meilleures pratiques pour ce et IHttpActionResult
semble être ce que je devrais être en utilisant.
J'ai essayé de return Json(json);
mais il en résulte non valide, unparsable JSON, sans doute parce qu'il essaie de faire une double conversion?
return Ok(json);
résultats dans la chaîne JSON être enveloppé dans du XML.
Quelle est la bonne façon de le faire?
EDIT:
J'ai réussi à convertir chaque méthode dans ce projet d'utiliser IHttpActionResult maintenant, à l'exception de cette méthode particulière.
C'est une sérialisation d'un générique arbre en JSON. Quelle que soit la démarche que j'essaie, je serai de retour invalid JSON. Le HttpResponseMsessage
approche fonctionne bien, mais je ne peux pas obtenir JSON valide de retour avec IHttpActionResult
.
Vous devez vous connecter pour publier un commentaire.
Bonne nuit. J'ai eu le même problème et ce morceau de code a fonctionné pour moi (à l'Aide de Newtonsoft.Json package nuget pour désérialiser le json):
Il semble que nous devons avoir un objet afin de le Json() fonctionne comme il faut.
Vous pouvez créer votre propre IHttpActionResult instance de classe pour retourner le JSON et une méthode de votre contrôleur ou de la base de contrôleur de classe à l'utiliser.
Créer le IHttpActionResult instance qui définit le contenu et le code d'état:
Ajouter une méthode à votre contrôleur pour créer le résultat. Voici une API Web exemple:
Une autre recommandation est comme ci-dessous;
var json = JToken.FromObject(yourObject, new JsonSerializer { ContractResolver = new CamelCasePropertyNamesContractResolver() });
Si vous n'avez pas l'intention d'utiliser XML comme un type de retour, vous pouvez également supprimer le XmlFormatter dans votre WebApiConfig:
return Ok(json);
en place. Je note qu'il a FAIT retirer les XML des emballages. Je suppose que je vais courir ce par le biais de Violoneux et voir ce que les en-têtes sont.public class Node<T> : IEqualityComparer, IEnumerable<T>, IEnumerable<Node<T>>
j'ai repris leHttpResponseMessage
avec mon convertisseur personnalisé. J'ai édité ma question de le dire. Mes autres méthodes qui étaient de retour beaucoup plus simple JSON converti àIHttpActionResult
facilement.La bonne façon est de retour:
Ok(json);
C'est en convertissant le résultat au format XML, parce que c'est accepté par défaut le type de retour. Essayez d'ajouter:
Accept: application/json
dans votre API-têtes de la requête, je pense que cela devrait résoudre le problème.Accept
? Est-ce pour enRegisterGlobalFilters
? Je ne veux pas faire cela 5 fois plus complexe juste pour changer le type de retour. J'espérais que ce serait plus facile, j'ai déjà la bonne JSON dans une chaîne de caractères, prêt à envoyer.J'ai eu le même problème avec un service web retournant chaîne JSON en XML-tag. J'ai essayé toutes les solutions les plus simples Comme :
retour Json(texte) , json désérialiser et l'ajout de config.Formateur pour l'json, mais qui ne l'aide pas. J'ai eu le double de côtes autour de l'objet json ou il a été mal formé.
Seulement la solution écrite par TGRA a fonctionné pour moi.
créer votre propre IHttpActionResult instance de classe pour retourner le JSON