web-dev-qa-db-ja.com

ビューで.NetオブジェクトをJSONオブジェクトに変換する

ビューで.NetオブジェクトをJSONに変換したい。私のビューモデルはこんな感じです

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

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

変換したいModel.SearchResult in JSONオブジェクト。現在、私はこれを次のようにしています:

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

でも結果はこんな感じ

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

これをJSONオブジェクトに正しく変換するにはどうすればよいですか?

33

この方法を試してください:

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

65
Kyeotic

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));
}

ビューで:

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

Hemantのreferで言及されているように、serializerをJSON.Encode(..)に置き換える必要があります。 (それ自体はJavaScriptSerializerを使用します)。

問題の原因は、HTMLがJSONをエンコードする「@」です。 @ Html.Raw(..)を使用して、この動作を回避できます。

+:Json.Netをご覧ください http://json.codeplex.com/

JSON.Net update

ヘルパーをJSON.netで更新しました(はるかに優れています)。

一部のユーザーは古いコードを読み、投票し、使用し続けているようです。以下の新しいバージョンを使用するか、または NGon を使用して、より良い方法を使用したいのですが、 Matthew Nichols はコメントでそれを認識しています。

コードは次のとおりです。

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

これは私の元の答えの更新であり、@ Tyrsius:Dのしつこいバッジリングの結果として、MVCの<script>タグで作成された変数にアクセスできないという事実を放棄することを拒否したことを認めます5個の.jsライブラリからのcshtmlページを別々のファイルで、そこで作成されたvarsが@scope scriptステートメントブロック内にスクリプトタグを配置すると、グローバルスコープが作成され、プラグインウィジェットで使用できることを発見しました。現時点では、より複雑なアプリでは使用していませんが、別のアプリのprotoTypeで使用しました。その答えは以下のとおりです。これで@ Html.Raw(...)が機能し、すぐに使用できるオブジェクトをシリアル化できました。

これは私がこれから使用するものです...再び私と一緒にハングアップしてくれてありがとう@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")
    }

次のコードは別の.jsファイルにあります

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