【问题标题】:Dynamically chose type depending on JSON content根据 JSON 内容动态选择类型
【发布时间】:2012-08-30 02:50:45
【问题描述】:

在 ASP.NET MVC 4 应用程序中,我从包含“字段”数组的外部服务器获得 JSON 响应。每个字段都有一个单独的类型,并包含该类型值的数组。

我想将该 JSON 反序列化为 DynamicObject 以便我可以访问单个值属性,或者我需要某种子类选择器来决定需要从“ValueBase”类派生的类访问单个值对象的不同属性。

我希望你明白我的意思……这有点复杂。

我已经尝试将其反序列化为 DynamicObject(即从 DynamicObject 派生的类)。但是当我在视图中访问该对象的动态属性时收到错误消息,我想显示的属性不存在。

那么,从 DynamicObject 派生的类如何才能接受并授予对 JSON 代码提供的各个不同“值”属性的访问权限?

如果这是不可能的或错误的方法,我将如何实现合适的类型选择器类?

非常感谢!

【问题讨论】:

  • 如果这是一个特定于 ASP.Net 的问题,它可能会受益于被标记为这样,以获得更多 ASP.Net 人员的关注。
  • 你是对的。我知道我忘记了什么……好吧,它被标记了。

标签: asp.net asp.net-mvc json dynamic deserialization


【解决方案1】:

我自己已经解决了。

我没有将返回的 JSON 对象(更准确地说是 JSON 数组)直接转换为特定的类,而是将其作为 dynamic 获取,并将其提供给包含集合的类的构造函数该对象实际上应该属于的另一个类的实例(无论如何,我得到了一个从 Web 服务返回的 JSON 数组)。在集合类的构造函数中,我根据 JSON 对象的值来决定新对象将是哪个继承类,并将其放入集合中。是的,我不知何故走那条路,但它有效。

看起来像这样:

public CollectionClass(dynamic dyn)
{
  foreach(var item in dyn.items) {
    switch((string)item.external_id) { // might have used a Dictionary instead but...
      case "member":
        this._collection.Add(new Member(item));
        break;
      case "date":
        this._collection.Add(new Date(item));
        break;
      default: break;
    }
  }
}

Member-class 本身包含一个类似的构造函数,它也需要一个动态 参数。它还根据 item 中的值“建立自己”。

如果有任何更简单的方法或实现此目标的“王道”,我将不胜感激任何进一步的建议。

【讨论】:

    猜你喜欢
    • 2017-03-04
    • 2017-12-15
    • 1970-01-01
    • 2017-11-11
    • 2014-05-24
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 2012-11-27
    相关资源
    最近更新 更多