Могу ли я контролировать, какой подтип использовать при десериализации строки JSON? - PullRequest
3 голосов
/ 25 июля 2010

Я работаю с Facebook API, и метод поиска возвращает 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 Ответ

3 голосов
/ 25 июля 2010

Если вы используете

System.Web.Script.Serialization.JavaScriptSerializer

, вы можете использовать перегрузку в конструкторе, чтобы добавить свой собственный преобразователь классов:

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

Пример того, как реализовать это, можно найти здесьна SO: JavaScriptSerializer с пользовательским типом

Но вы должны заменить

"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);
    }
}
...