首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将通过ASP.NETMVC中的JsonResult返回的ExpandoObject扁平化?

如何将通过ASP.NETMVC中的JsonResult返回的ExpandoObject扁平化?
EN

Stack Overflow用户
提问于 2018-03-09 00:30:43
回答 2查看 0关注 0票数 0

我真的很喜欢在运行ExpandoObject时编译服务器端动态对象,但是我在JSON序列化期间无法平滑这些东西。首先,我实例化对象:

代码语言:txt
复制
dynamic expando = new ExpandoObject();
var d = expando as IDictionary<string, object>;
expando.Add("SomeProp", SomeValueOrClass);

到现在为止还挺好。在我的MVC控制器中,我想将它作为JsonResult发送,所以我这样做:

代码语言:txt
复制
return new JsonResult(expando);

这会将JSON序列化到下面,供浏览器使用:

代码语言:txt
复制
[{"Key":"SomeProp", "Value": SomeValueOrClass}]

但是,我真正想看到的是:

代码语言:txt
复制
{SomeProp: SomeValueOrClass}

我知道我可以实现这一点,如果我使用,dynamic而不是ExpandoObject- JsonResult能够序列化dynamic属性和值到一个对象(没有关键或价值业务),但我需要使用的原因ExpandoObject是因为我不知道所有我想要的对象直到运行时的属性,并据我所知,我不能动态地添加一个属性,dynamic而不使用一个ExpandoObject

我可能不得不在JavaScript中筛选“Key”,“Value”业务,但我希望在将它发送给客户端之前弄清楚。

EN

回答 2

Stack Overflow用户

发布于 2018-03-09 08:56:26

也可以创建一个仅用于ExpandoObject的特殊JSONConverter,然后将其注册到JavaScriptSerializer的一个实例中。这样,可以序列化expando数组,expando对象的组合以及......直到找到另一种没有正确序列化的对象(“想要的方式”),然后再创建另一个Converter或将另一个类型添加到这个。希望这可以帮助。

代码语言:txt
复制
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) });
        }
    }
}

使用转换器

代码语言:txt
复制
var serializer = new JavaScriptSerializer(); 
serializer.RegisterConverters(new JavaScriptConverter[] { new ExpandoJSONConverter()});
var json = serializer.Serialize(obj);
票数 0
EN

Stack Overflow用户

发布于 2018-03-09 10:11:20

使用JSON.NET,可以调用SerializeObject“扁平化”扩张性对象:

代码语言:txt
复制
dynamic expando = new ExpandoObject();
expando.name = "John Smith";
expando.age = 30;

var json = JsonConvert.SerializeObject(expando);

将输出:

代码语言:txt
复制
{"name":"John Smith","age":30}

在ASP.NET MVC控制器的上下文中,可以使用Content-method返回结果:

代码语言:txt
复制
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");
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100007554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档