Il y a longtemps, je mis une norme de codage pour mon application que toutes les actions de retour JSON aurait leurs résultats mis dans un objet wrapper de haut niveau:Personnalisation sérialisation JSON en sortie d'action MVC
var result = {
success: false,
message: 'Something went wrong',
data: {} // or []
}
qui a bien fonctionné , et m'a fourni un bon standard de normalisation de code. Aujourd'hui, cependant, je me suis rendu compte que mon code côté serveur suppose qu'il doit toujours effectuer la sérialisation complète de ce qui est renvoyé. Maintenant, je voudrais sérialiser l'un de ces gars où la charge "data" est déjà une chaîne JSON bien formée.
Ceci est le schéma général qui avait travaillé:
bool success = false;
string message = "Something went wrong";
object jsonData = "[{\"id\":\"0\",\"value\":\"1234\"}]"; // Broken
dynamic finalData = new { success = success, message = message, data = jsonData };
JsonResult output = new JsonResult
{
Data = finalData,
JsonRequestBehavior = JsonRequestBehavior.AllowGet,
MaxJsonLength = int.MaxValue
};
return output;
Là où le bât est que l'élément « de données » sera reçue comme une chaîne quand il est au navigateur, et non pas comme le JSON bon objet (ou tableau dans l'exemple ci-dessus) il devrait être.
Y a-t-il un moyen de décorer une propriété avec un attribut qui dit «serialize as raw», ou suis-je dans le domaine de l'écriture d'un sérialiseur JSON personnalisé pour que cela fonctionne?
Vous devez utiliser 'json.parse'. Lire tous les détails ici https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse –
Eh bien, techniquement, vous brisez votre propre contrat et standard. Auparavant, vous attendiez un * objet *, maintenant vous lui passez une chaîne. Il me semble que c'est une mauvaise façon de faire les choses, mais vous * pouvez * écrire 'data = JsonSerializer.Deserialize (jsonData)' s'il n'y a aucun moyen d'éviter cette chaîne. Notez cependant que vous ne le sérialiserez que pour le désérialiser ultérieurement. – Rob
json.parse se trouve à la fin du navigateur.J'essaie de manipuler la sérialisation du côté serveur. Rob, vous êtes exactement sur le problème .. Je ne veux pas le déssérialiser, juste pour ensuite le REserialize immédiatement (et vraiment juste pour mettre un emballage mince autour de ce qui était déjà parfaitement bon JSON). Je pense que j'ai rassemblé une solution, et posterai cela demain. Merci à vous deux! – Eric