根据JSON内容动态选择类型

时间:2012-09-05 11:34:18

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

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

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

我希望你知道我的意思......这有点复杂。

我已经尝试将其反序列化为DynamicObject(一个派生自DynamicObject的类)。但是在View中访问该对象的动态属性时,我得到的错误消息是我不想显示我想要显示的属性。

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

如果那是不可能或错误的方法,我怎么必须实现一个合适的类型选择器类?

非常感谢!

1 个答案:

答案 0 :(得分:0)

我自己有点解决了。

不是直接将返回的JSON对象(更精确的JSON数组)转换为特定的类,而是将其作为动态获取,并将其提供给包含集合的类的构造函数该对象实际上应该是另一个类的实例(无论如何我从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本身包含一个类似的构造函数,它还需要一个 dynamic 参数。它还根据中的值“自行构建”。

如果有任何更简单的方法或实现这一目标的“皇家之路”,我将不胜感激任何进一步的建议。