在运行时编译服务器端动态对象时,我真的很喜欢 ExpandoObject
,但是在 JSON 序列化过程中我无法将其展平。首先,我实例化对象:
dynamic expando = new ExpandoObject();
var d = expando as IDictionary<string, object>;
expando.Add("SomeProp", SomeValueOrClass);
到目前为止一切顺利。在我的 MVC Controller 中,我想将它作为 JsonResult 发送下来,所以我这样做:
return new JsonResult(expando);
这会将 JSON 序列化为以下内容,供浏览器使用:
[{"Key":"SomeProp", "Value": SomeValueOrClass}]
但是,我真正想看到的是:
{SomeProp: SomeValueOrClass}
我知道如果我使用 dynamic
而不是 ExpandoObject
可以实现这一点 -- JsonResult
能够序列化 dynamic
属性和值到单个对象中(没有 Key 或 Value 业务),但我需要使用 ExpandoObject
的原因是因为我不知道我想要的所有属性在对象上直到运行时,据我所知,如果不使用 ExpandoObject
,我无法将属性动态添加到 dynamic
。
我可能需要在我的 javascript 中筛选“Key”、“Value”业务,但我希望在将其发送给客户之前弄清楚这一点。感谢您的帮助!
最佳答案
使用 JSON.NET,您可以调用 SerializeObject 来“展平”expando 对象:
dynamic expando = new ExpandoObject();
expando.name = "John Smith";
expando.age = 30;
var json = JsonConvert.SerializeObject(expando);
将输出:
{"name":"John Smith","age":30}
在 ASP.NET MVC Controller 的上下文中,可以使用 Content-method 返回结果:
public class JsonController : Controller
{
public ActionResult Data()
{
dynamic expando = new ExpandoObject();
expando.name = "John Smith";
expando.age = 30;
var json = JsonConvert.SerializeObject(expando);
return Content(json, "application/json");
}
}
关于c# - 如何在asp.net mvc中展平通过JsonResult返回的ExpandoObject?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5156664/