使用Razor视图引擎输出Json

时间:2010-12-06 13:55:08

标签: asp.net-mvc json asp.net-mvc-3 razor

我的视图模型中有一个dictionary<string,string>。我要做的是循环这个对象并将其输出为json对象。我的理由是,我可以正确地本地化我的客户端脚本文件。

此输出需要看起来像

var clientStrings = {"test":"yay","goodBye":"Nah"};

任何想法如何正确实现这一点。

提前致谢。

3 个答案:

答案 0 :(得分:15)

它内置于MVC中。只需返回Json(yourobject)。

答案 1 :(得分:10)

考虑到您使用的是mvc 3,您可以访问JavaScriptSerializer。您应该能够执行以下操作:

JavaScriptSerializer serializer = new JavaScriptSerializer();
string json = serializer.Serialize((object)yourDictionary);

这会将您的字典序列化为json。在将ViewData发送到要渲染的视图之前,您可能希望在控制器中执行此操作。

答案 2 :(得分:7)

您还可以在代码中集成免费的Json.NET库。

这个库不会遇到问题JavascriptSerializer有循环引用问题。

这是一个使用库从控制器操作输出JSON的示例

public virtual ActionResult ListData() {
    Dictionary<string, string> openWith = new Dictionary<string, string>();
    openWith.Add( "txt", "notepad.exe" );
    openWith.Add( "bmp", "paint.exe" );
    openWith.Add( "dib", "paint.exe" );
    openWith.Add( "rtf", "wordpad.exe" );

    JsonNetResult jsonNetResult = new JsonNetResult();
    jsonNetResult.Formatting = Formatting.Indented;
    jsonNetResult.Data = openWith;
    return jsonNetResult;
}

如果您执行此操作,您将获得以下结果

{
  "txt": "notepad.exe",
  "bmp": "paint.exe",
  "dib": "paint.exe",
  "rtf": "wordpad.exe"
}

JsonNetResult是一个围绕Json.NET库功能的简单自定义包装类。

public class JsonNetResult : ActionResult
{
    public Encoding ContentEncoding { get; set; }
    public string ContentType { get; set; }
    public object Data { get; set; }

    public JsonSerializerSettings SerializerSettings { get; set; }
    public Formatting Formatting { get; set; }

    public JsonNetResult() {
        SerializerSettings = new JsonSerializerSettings();
    }

    public override void ExecuteResult( ControllerContext context ) {
        if ( context == null )
            throw new ArgumentNullException( "context" );

        HttpResponseBase response = context.HttpContext.Response;

        response.ContentType = !string.IsNullOrEmpty( ContentType )
            ? ContentType
            : "application/json";

        if ( ContentEncoding != null )
            response.ContentEncoding = ContentEncoding;

        if ( Data != null ) {
            JsonTextWriter writer = new JsonTextWriter( response.Output ) { Formatting = Formatting };

            JsonSerializer serializer = JsonSerializer.Create( SerializerSettings );
            serializer.Serialize( writer, Data );

            writer.Flush();
        }
    }
}