web-dev-qa-db-fra.com

Convertir un objet .Net en objet JSON dans la vue

Je souhaite convertir un objet .Net au format JSON dans la vue. Mon modèle de vue est comme ça,

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

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

Je souhaite convertir Model.SearchResult en un objet JSON. Currenty je le fais comme ça:

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

mais le résultat est comme ça,

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

Comment puis-je convertir cela correctement en un objet JSON?

32

J'utilise cet assistant depuis 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));
}

Et dans la vue:

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

Je devrais remplacer le sérialiseur par le JSON.Encode (..) maintenant, comme indiqué dans la référence de Hemant. (Il utilise lui-même JavaScriptSerializer).

La source de votre problème est le "@" qui code HTML pour le JSON. Vous pouvez utiliser @ Html.Raw (..) pour éviter ce problème.

+: jetez un coup d'œil à Json.Net http://json.codeplex.com/

Mise à jour JSON.Net

J'ai mis à jour l'assistant il y a quelque temps avec JSON.net (bien mieux).

Il semble que certains utilisateurs continuent à lire, à voter et à utiliser l'ancien code. J'aimerais qu'ils utilisent un meilleur moyen, avec la nouvelle version ci-dessous, ou en utilisant NGon like Matthew Nichols l'a remarqué dans un commentaire.

Voici le code:

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));
    }
  }
}
34
Loic El Thesea

Ceci est une mise à jour de ma réponse initiale et j'admettrai qu'en raison du harcèlement persistant de @Tyrsius: D qui a refusé d'abandonner le fait que je ne pouvais pas accéder aux vars créés avec les balises <script> dans ma page cshtml MVC 5 à partir de Mes bibliothèques .js dans des fichiers séparés, j'ai découvert que si je plaçais les balises de script dans le bloc d'instructions de scripts @section créé par les vars, la portée globale était disponible pour mes widgets de plug-in. Je ne l'ai pas encore utilisé dans mes applications les plus complexes, mais je l'ai utilisé dans un protoType d'une autre application et la réponse est ci-dessous. Maintenant, @ Html.Raw (...) fonctionne et j'ai pu sérialiser un objet que je pouvais utiliser immédiatement. 

C’est quelque chose que je vais utiliser à partir de maintenant ... merci encore d’avoir passé du temps avec moi @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")
    }

Le code suivant est dans un fichier .js séparé

$(document).ready(function() {  
    alert(JSON.stringify(testVar));
});
1
Clarence