如果:

dynamic expando = new ExpandoObject();
d.SomeProp=SomeValueOrClass;

然后,我们在控制器中:

return new JsonResult(expando);

那么,我们的前台将会得到:

[{"Key":"SomeProp", "Value": SomeValueOrClass}]

而实际上,我们知道,JSON 格式的内容,应该是这样的:

{SomeProp: SomeValueOrClass}

于是乎,我们需要一个自定义的序列化器,它应该如下:

public class ExpandoJSONConverter : JavaScriptConverter
{
    public override IEnumerable<Type> SupportedTypes
    {
        get
        {
            return new ReadOnlyCollection<Type>(new Type[] { typeof(System.Dynamic.ExpandoObject) });
        }
    }

    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 ContentResult GetSomeThing(string categores)
{
    return ControllProctector.Do1(() =>
        {

            …
            var serializer = new JavaScriptSerializer();
            serializer.RegisterConverters(new JavaScriptConverter[] { new ExpandoJSONConverter() });
            var json = serializer.Serialize(expando);
            return new ContentResult
            {
                Content = json,
                ContentType = "application/json"
            };
        });
}

我们的浏览器就能得到正确的 JSON 字符串了。

 

备注:其它的方法还有

一:

dynamic expando = new ExpandoObject();
expando.Blah = 42;
expando.Foo = "test";
...

var d = expando as IDictionary<string, object>;
d.Add("SomeProp", SomeValueOrClass);

// After you've added the properties you would like.
d = d.ToDictionary(x => x.Key, x => x.Value);
return new JsonResult(d);

二: JSON.NET

dynamic expando = new ExpandoObject();
expando.name = "John Smith";
expando.age = 30;

var json = JsonConvert.SerializeObject(expando);

三:Content-method:

public ActionResult Data()
{
    dynamic expando = new ExpandoObject();
    expando.name = "John Smith";
    expando.age = 30;

    var json = JsonConvert.SerializeObject(expando);

    return Content(json, "application/json");
}

参考:http://stackoverflow.com/questions/5156664/how-to-flatten-an-expandoobject-returned-via-jsonresult-in-asp-net-mvc

最新文章

  1. 为什么要在游戏开发中使用ECS模式
  2. nodejs 模块恩仇录
  3. PHP数组
  4. Uncaught exception &#39;PDOException&#39; with message &#39;SQLSTATE[HY000] [2002] No such file or directory&#39;
  5. 微信开发-ACCESS TOKEN 过期失效解决方案
  6. ZooKeeper学习第五期--ZooKeeper管理分布式环境中的数据
  7. C++C++中构造函数与析构函数的调用顺序
  8. uva 1025,城市的间谍
  9. android + javascript 相互通信实例分析
  10. NET
  11. mac 修改密码后 频繁输入钥匙串问题修复方法
  12. 使用Jquery+EasyUI项目开发情况的框架是中评---员工管理源代码共享
  13. Java数据持久层框架 MyBatis之背景知识一
  14. Python系列:三、流程控制循环语句--技术流ken
  15. (转载)C#关于DateTime得到的当前时间的格式和用法
  16. neutron通信原理理解
  17. python3 得到a.txt中有的而b.txt中没有的汉字
  18. oracle授予调用存储过程权限
  19. Oracle导出DMP文件的两种方法
  20. python笔记06-----常用模块(time,os,sys,random)

热门文章

  1. Vue开源
  2. Spark streaming的执行流程
  3. Python装饰器进阶
  4. sql 多表查询结果验证
  5. jquery插件机制
  6. 002.FTP配置项详解
  7. 如何对vue项目进行优化,加快首页加载速度
  8. 捕获程序异常之onerror
  9. 快速排序之Java实现
  10. Javascript:10天设计一门语言