我的视图模型中有一个dictionary<string,string>
。我要做的是循环这个对象并将其输出为json对象。我的理由是,我可以正确地本地化我的客户端脚本文件。
此输出需要看起来像
var clientStrings = {"test":"yay","goodBye":"Nah"};
任何想法如何正确实现这一点。
提前致谢。
答案 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();
}
}
}