【问题标题】:Can I control what subtype to use when deserializing a JSON string?我可以控制反序列化 JSON 字符串时使用的子类型吗?
【发布时间】:2011-03-20 18:22:43
【问题描述】:

我正在使用 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 以反对跛脚的投票。

标签: c# json facebook serialization datacontractserializer


【解决方案1】:

如果你使用

System.Web.Script.Serialization.JavaScriptSerializer

您可以使用构造函数中的重载来添加自己的类解析器:

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

可以在 SO 上找到如何实现此功能的示例: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);
    }
}

【讨论】:

  • 有趣!我做了一些更改,FacebookResolver 正在触发。但我看不到我的public List&lt;Item&gt; Results { get; set; } 已满;我错过了什么吗?
  • 刚刚发现另一个提示:当我使用JavaScriptSerializer.DeserializeObject 时,我可以看到所有子对象序列化,但在data 属性内。似乎缺少将 DataMember(Name="data") 属性映射到 List&lt;Item&gt; Results 属性
  • 似乎__type 属性必须是 JSON 字符串中的第一个;我试图构建一个正则表达式来订购该属性,但这很难做到。底线:我放弃了尝试专门化 JSON 对象并使用非规范化版本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多