2010-10-21 3 views
9

Json brut ayant une string contenant les données brutes Json (simplifiées pour le bien de la question):ASP.Net MVC: comment créer un JsonResult basé sur les données

var MyString = "{ 'val': 'apple' }"; 

Comment puis-je créer un JsonResult objet représentant MyString?

J'ai essayé d'utiliser la méthode JSON (objet). mais il gère les données json brutes comme une chaîne - logiquement: P-. Donc, la réponse HTTP renvoyé ressemble:

"{ 'val': 'apple' }" 

au lieu des premières données JSON donné:

{ 'val': 'apple' } 

ce que je veux réaliser:

Répondre

21

La méthode Json() sur Controller est en fait une méthode d'assistance qui crée un nouveau JsonResult. Si nous regardons the source code for this class*, nous pouvons voir qu'il ne fait pas vraiment beaucoup - juste en réglant le type de contenu à application/json, sérialisant votre objet de données en utilisant un JavaScriptSerializer, et en écrivant la chaîne résultante .. Vous pouvez dupliquer ce comportement (moins la sérialisation, puisque vous l'avez déjà fait) en retournant un ContentResult à partir de votre contrôleur à la place.

public ActionResult JsonData(int id) { 
    var jsonStringFromSomewhere = "{ 'val': 'apple' }"; 
    // Content() creates a ContentResult just as Json() creates a JsonResult 
    return Content(jsonStringFromSomewhere, "application/json"); 
} 

* À partir de MVC2, JsonResult lancers francs aussi une exception si l'utilisateur fait une requête HTTP GET (par opposition à dire POST). Permettre aux utilisateurs de récupérer JSON à l'aide d'un HTTP GET a security implications dont vous devez être conscient avant de l'autoriser dans votre propre application.

+2

+1 - mais selon http://json.org cependant, les clés et les valeurs doivent être placées entre guillemets doubles et non uniques. –

+0

Belle prise. Je viens de copier la chaîne utilisée par le demandeur. Bien sûr, toute cette réponse suppose que vous savez * que votre chaîne JSON est valide pour commencer, de sorte que le navigateur Web du client ne s'étouffe pas. –

+0

Merci, Brant. +1 – SDReyes

0

Je pense que vous pouvez utiliser le JavaScriptSerializer classe pour ce

var js = new System.Web.Script.Serialization.JavaScriptSerializer(); 
var jsonObject = js.Deserialize("{ 'val': 'apple' }", typeof(object)); 
+0

Cela fonctionnerait-il pour le sérialiser en tant qu'objet? Je ne pense pas que le sérialiseur ajoute des propriétés à l'objet sérialisé, je pense qu'il recherche seulement les propriétés sur l'objet qui correspondent aux propriétés dans le JSON. Peut-être pourriez-vous essayer 'dynamic'? –

+0

Ça a marché pour moi mais j'aime mieux l'idée de Brant. –

+0

Ceci désérialiserait l'objet uniquement pour être à nouveau sérialisé. – BJury

1

J'ai généré des données JSON à partir d'une chaîne est à l'aide JavaScriptResult dans le contrôleur:

public JavaScriptResult jsonList(string jsonString) 
{ 
    jsonString = "var jsonobject = new Array(" + jsonString + ");"; 
    return JavaScript(jsonString) 
} 

Ensuite, lorsque vous demandez passer la chaîne JSON à cette action dans votre contrôleur, le résultat sera un fichier avec JavaScript en-têtes.

Questions connexes