代码之家  ›  专栏  ›  技术社区  ›  Rubens Farias

我可以控制在反序列化JSON字符串时使用的子类型吗?

  •  3
  • Rubens Farias  · 技术社区  · 14 年前

    我正在使用Facebook API search method 返回这样的JSON响应:

    {
       "data": [
          {
             "id": "1",
             "message": "Heck of a babysitter...",
             "name": "Baby eating a watermelon",
             "type": "video"
          },
          {
             "id": "2",
             "message": "Great Produce Deals",
             "type": "status"
          }
       ]
    }
    

    我有一个类似的类结构:

    [DataContract]
    public class Item
    {
        [DataMember(Name = "id")]
        public string Id { get; set; }
    }
    
    [DataContract]
    public class Status : Item
    {
        [DataMember(Name = "message")]
        public string Message { get; set; }
    }
    
    [DataContract]
    public class Video : Item
    {
        [DataMember(Name = "string")]
        public string Name { get; set; }
    
        [DataMember(Name = "message")]
        public string Message { get; set; }
    }
    
    [DataContract]
    public class SearchResults
    {
        [DataMember(Name = "data")]
        public List<Item> Results { get; set; }
    }
    

    我怎样才能根据这个使用正确的子类 type 属性?

    1 回复  |  直到 14 年前
        1
  •  3
  •   Community dbr    7 年前

    如果您使用

    System.Web.Script.Serialization.JavaScriptSerializer
    

    可以使用构造函数中的重载添加自己的类冲突解决程序:

    JavaScriptSerializer myserializer = new JavaScriptSerializer(new FacebookResolver());
    

    关于如何实现这一点的示例,请参见以下内容: JavaScriptSerializer with custom Type

    但是你应该换掉

    "type": "video"
    

    部分到

    "__type": "video"
    

    因为这是班级的惯例。

    下面是一个例子:

    public class FacebookResolver : SimpleTypeResolver
    {
        public FacebookResolver() { }
        public override Type ResolveType(string id)
        {
            if(id == "video") return typeof(Video);
            else if (id == "status") return typeof(Status)
            else return base.ResolveType(id);
        }
    }