2011-04-06 15 views
7

Tengo una JSON.NET jobject con datos estructurados de esta manera:Excepción convertir JSON.NET jobject a JsonResult

{ 
    "foo" : { 
     "bar": "baz" 
    } 
} 

Estoy tratando de convertirlo en un ASP.NET MVC JsonResult de la siguiente manera:

JObject someData = ...; 
JsonResult jsonResult = Json(someData, "application/json", JsonRequestBehavior.AllowGet); 

Cuando hago esto, me sale el siguiente excepción:

InvalidOperationException era no controlada por el código de usuario. No se puede acceder al valor hijo en Newtonsoft.Json.Linq.JValue.

tengo una solución, en la que puedo iterar a través de todas las propiedades de la jobject, y analizarlos en un objeto genérico de este modo:

JsonResult jsonResult = Json(new { key1 = value1, key2 = value2, ... }); 

Sin embargo, esto parece propenso a errores, y al igual una forma innecesaria y no genérica de resolver este problema. ¿Hay alguna forma de que pueda hacer esto de manera más eficiente, con la esperanza de usar algunos métodos integrados en JSON.NET o ASP.NET MVC?

+0

¿Por qué no simplemente serializar su objeto usando JSON.net, y luego escribir eso como un resultado de contenido? – Tejs

Respuesta

13

Si tiene un JObject, le recomendaría que escriba un ActionResult personalizado que serialice directamente este JObject usando JSON.NET en el flujo de respuesta. Es más en el espíritu del patrón MVC:

public ActionResult Foo() 
{ 
    JObject someData = ...; 
    return new JSONNetResult(someData); 
} 

donde:

public class JSONNetResult: ActionResult 
{ 
    private readonly JObject _data; 
    public JSONNetResult(JObject data) 
    { 
     _data = data; 
    } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     var response = context.HttpContext.Response; 
     response.ContentType = "application/json"; 
     response.Write(_data.ToString(Newtonsoft.Json.Formatting.None)); 
    } 
} 

Parece una exageración para tener un jobject la que le serializar en JSON utilizando .NET JavaScriptSerializer que es más comúnmente utilizado en conjunción con algunas clases modelo.

+1

Gracias, usando su entrada encontré el siguiente enlace del autor: http://james.newtonking.com/archive/2008/10/16/asp-net-mvc-and-json-net.aspx, que me dio lo que estaba buscando. –

Cuestiones relacionadas