2010-10-21 12 views
9

Avere un string contenente i seguenti dati JSON prime (semplificato per il bene della questione):ASP.Net MVC: come creare un JsonResult sulla base di prime JSON dati

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

Come posso creare un JsonResult oggetto che rappresenta MyString?

Ho provato a utilizzare il metodo Json (oggetto). ma gestisce i dati json non elaborati come una stringa -logicamente: P-. Quindi la risposta HTTP restituito assomiglia:

"{ 'val': 'apple' }" 

invece del dato grezzo JSON dati:

{ 'val': 'apple' } 

questo è ciò che voglio raggiungere:

risposta

21

Il metodo Json() su Controller è in realtà un metodo di supporto che crea un nuovo JsonResult. Se guardiamo a the source code for this class*, possiamo vedere che in realtà non sta facendo molto - basta impostare il tipo di contenuto su application/json, serializzare l'oggetto dati usando uno JavaScriptSerializer e scriverlo come stringa risultante. Puoi duplicare questo comportamento (meno la serializzazione, dato che l'hai già fatto) restituendo un ContentResult dal tuo controller.

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

* A partire dal MVC2, JsonResult tiri anche un'eccezione se l'utente sta facendo una richiesta HTTP GET (in contrapposizione a dire una POST). Consentire agli utenti di recuperare JSON utilizzando un GET HTTP ha security implications di cui dovresti essere a conoscenza prima di autorizzarlo nella tua app.

+2

+1 - ma secondo http://json.org però, le chiavi e i valori devono essere racchiusi tra virgolette e non singole. –

+0

Bella cattura. Ho appena copiato la stringa utilizzata dal richiedente. Naturalmente, questa intera risposta presuppone che tu * sappia * che la tua stringa JSON è valida per iniziare, in modo che il browser web del cliente non vi soffochi sopra. –

+0

Grazie, Brant. +1 – SDReyes

0

Penso che si può utilizzare il Classe JavaScriptSerializer per questo

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

Funzionerebbe per serializzarlo come un oggetto? Non penso che il serializzatore aggiunga proprietà all'oggetto serializzato, penso che cerchi solo le proprietà sull'oggetto che corrispondono alle proprietà nel JSON. Forse potresti provare 'dynamic' però? –

+0

Ha funzionato per me, ma mi piace l'idea di Brant. –

+0

Ciò deserializza l'oggetto solo per essere nuovamente serializzato. – BJury

1

Il modo Ho generato dati JSON da una stringa è quello di utilizzare JavaScriptResult nel controller:

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

Poi quando si richiede passare la stringa JSON a che l'azione nel controller, il risultato sarà un file con JavaScript intestazioni.

Problemi correlati