2011-12-14 17 views
32

Quiero convertir un objeto .Net en JSON en la vista. Mi modelo es vista como esta,Convertir objeto .Net al objeto JSON en la vista

public class ViewModel{ 
    public SearchResult SearchResult { get; set;}  
}  

public class SearchResult { 
    public int Id { get; set; } 
    public string Text{ get; set; } 
} 

quiero convertir en Model.SearchResult a un objeto JSON. Currenty lo estoy haciendo de esta manera:

System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); 
//.... 
var s = @serializer.Serialize(Model.Institution); 

pero el resultado es así,

var s = { "Name":"a","Id":1}; 
Create:228Uncaught SyntaxError: Unexpected token & 

¿Cómo puedo convertir esto correctamente a un objeto JSON?

+0

consulte http: // stackoverflow.com/questions/3365551/asp-net-mvc-how-to-convert-view-model-into-json-object –

Respuesta

61

usar este método:

@Html.Raw(Json.Encode(Model.Content))

+1

+1 eso es simple y fácil – Vamsi

+0

¿Hay alguna manera de cambiar el serializador Json.Encode predeterminado a JSON.NET? –

+0

Si google '.net default json serializer', encontrará muchísimos enlaces para hacer exactamente eso. – Tyrsius

34

utilizo este helper desde asp.net mvc 2

public static MvcHtmlString ToJson(this HtmlHelper html, object obj) 
{ 
    JavaScriptSerializer serializer = new JavaScriptSerializer(); 
    return MvcHtmlString.Create(serializer.Serialize(obj)); 
} 

public static MvcHtmlString ToJson(this HtmlHelper html, object obj, int recursionDepth) 
{ 
    JavaScriptSerializer serializer = new JavaScriptSerializer(); 
    serializer.RecursionLimit = recursionDepth; 
    return MvcHtmlString.Create(serializer.Serialize(obj)); 
} 

Y en la vista:

<script> 
    var s = @(Html.ToJson(Model.Content)); 
    </script> 

que debería sustituir serializador con el JSON.Encode (..) ahora, como lo mencionan en la referencia de Hemant. (Se usa JavaScriptSerializer).

El origen de su problema es el "@" que HTML codifica el JSON. Puede usar @ Html.Raw (..) para evitar este comportamiento.

+: echar un vistazo por Json.Net http://json.codeplex.com/

JSON.Net actualizar

He actualizado el ayudante hace un tiempo con JSON.net (mucho mejor).

Parece que algunos usuarios continúan leyendo, transmitiendo y usando el código anterior. Me gustaría que utilicen una mejor manera, con la nueva versión a continuación, o al usar NGon como Matthew Nichols lo ha notado en un comentario.

Aquí está el código:

using System; 
using Newtonsoft.Json; 

namespace System.Web.Mvc 
{ 
    public static class HtmlHelperExtensions 
    { 
    private static readonly JsonSerializerSettings settings; 

    static HtmlHelperExtensions() 
    { 
     settings = new JsonSerializerSettings(); 
     // CamelCase: "MyProperty" will become "myProperty" 
     settings.ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver(); 
    } 

    public static MvcHtmlString ToJson(this HtmlHelper html, object value) 
    { 
     return MvcHtmlString.Create(JsonConvert.SerializeObject(value, Formatting.None, settings)); 
    } 
    } 
} 
+1

Normalmente configuro NGon (https://github.com/brooklynDev/NGon) para este tipo de Pero si solo uso en un solo lugar, esta es una buena solución. –

+0

¡No lo sé, gracias por la sugerencia! –

1

Esta es una actualización de mi respuesta original y voy a admitir que, como resultado de la badgering insistente de @Tyrsius: D que se negó a renunciar al hecho de que no podía acceder a vars creados en las etiquetas <script> en mi página MVC 5 cshtml de mis bibliotecas .js en archivos separados, descubrí que si colocaba las etiquetas de script dentro de @ stateme de secciones script No puedo bloquear el hecho de que los vars creados allí tenían el alcance global y estaban disponibles para mis widgets de complementos. Todavía no lo he usado en ninguna de mis aplicaciones más complejas, pero lo usé en un protoType de otra aplicación y la respuesta está debajo. Ahora funciona @ Html.Raw (...) y pude serializar un objeto que podía usar inmediatamente.

Esto es algo que va a utilizar a partir de ahora ... gracias de nuevo para colgar allí conmigo @Tyrsius

@section scripts 
    { 
    <script type="text/javascript"> 
     @using MRTCProtoType.Models.ControllerData.Contracts 

     var testVar = @Html.Raw(JsonConvert.SerializeObject(WMMWorkloadTestData.getWorkloadTestData())); 
    </script> 
     @Scripts.Render("~/bundles/homeworkflow") 
    } 

El siguiente código se encuentra en un archivo .js separados

$(document).ready(function() { 
    alert(JSON.stringify(testVar)); 
}); 
+0

Este es un interesante "gotcha" que no me he encontrado antes, gracias por incluirlo =) – Tyrsius

+1

Gracias por empujarme ... me hizo hacer el trabajo para encontrar una solución mucho mejor ... fíjate en la levedad de la credibilidad de la mano que te di en la vida ... – Clarence