我真的很喜欢在运行ExpandoObject
时编译服务器端动态对象,但是我在JSON序列化期间无法平滑这些东西。首先,我实例化对象:
dynamic expando = new ExpandoObject();
var d = expando as IDictionary<string, object>;
expando.Add("SomeProp", SomeValueOrClass);
到现在为止还挺好。在我的MVC控制器中,我想将它作为JsonResult发送,所以我这样做:
return new JsonResult(expando);
这会将JSON序列化到下面,供浏览器使用:
[{"Key":"SomeProp", "Value": SomeValueOrClass}]
但是,我真正想看到的是:
{SomeProp: SomeValueOrClass}
我知道我可以实现这一点,如果我使用,dynamic
而不是ExpandoObject
- JsonResult
能够序列化dynamic
属性和值到一个对象(没有关键或价值业务),但我需要使用的原因ExpandoObject
是因为我不知道所有我想要的对象直到运行时的属性,并据我所知,我不能动态地添加一个属性,dynamic
而不使用一个ExpandoObject
。
我可能不得不在JavaScript中筛选“Key”,“Value”业务,但我希望在将它发送给客户端之前弄清楚。
发布于 2018-03-09 08:56:26
也可以创建一个仅用于ExpandoObject的特殊JSONConverter,然后将其注册到JavaScriptSerializer的一个实例中。这样,可以序列化expando数组,expando对象的组合以及......直到找到另一种没有正确序列化的对象(“想要的方式”),然后再创建另一个Converter或将另一个类型添加到这个。希望这可以帮助。
using System.Web.Script.Serialization;
public class ExpandoJSONConverter : JavaScriptConverter
{
public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
{
throw new NotImplementedException();
}
public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
{
var result = new Dictionary<string, object>();
var dictionary = obj as IDictionary<string, object>;
foreach (var item in dictionary)
result.Add(item.Key, item.Value);
return result;
}
public override IEnumerable<Type> SupportedTypes
{
get
{
return new ReadOnlyCollection<Type>(new Type[] { typeof(System.Dynamic.ExpandoObject) });
}
}
}
使用转换器
var serializer = new JavaScriptSerializer();
serializer.RegisterConverters(new JavaScriptConverter[] { new ExpandoJSONConverter()});
var json = serializer.Serialize(obj);
发布于 2018-03-09 10:11:20
使用JSON.NET,可以调用SerializeObject“扁平化”扩张性对象:
dynamic expando = new ExpandoObject();
expando.name = "John Smith";
expando.age = 30;
var json = JsonConvert.SerializeObject(expando);
将输出:
{"name":"John Smith","age":30}
在ASP.NET MVC控制器的上下文中,可以使用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");
}
}
https://stackoverflow.com/questions/-100007554
复制相似问题