使用Razor视图引擎输出Json

Rub*_*ord 8 asp.net-mvc json razor asp.net-mvc-3

我有一个dictionary<string,string>视图模型的一部分.我要做的是循环这个对象并将其输出为json对象.我之所以这样,是因为我可以正确地本地化我的客户端脚本文件.

这个输出需要看起来像

var clientStrings = {"test":"yay","goodBye":"Nah"};
Run Code Online (Sandbox Code Playgroud)

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

提前致谢.

Mat*_*man 15

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


Jer*_* B. 10

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

JavaScriptSerializer serializer = new JavaScriptSerializer();
string json = serializer.Serialize((object)yourDictionary);
Run Code Online (Sandbox Code Playgroud)

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


Lor*_*nzo 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;
}
Run Code Online (Sandbox Code Playgroud)

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

{
  "txt": "notepad.exe",
  "bmp": "paint.exe",
  "dib": "paint.exe",
  "rtf": "wordpad.exe"
}
Run Code Online (Sandbox Code Playgroud)

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)