Общий список DataContractJsonSerializer, содержащий подтипы типов элементов

Я собираюсь использовать DataContractJsonSerializer для сериализации/десериализации JSON.

У меня есть два типа объектов в массиве JSON, и я хочу, чтобы они оба были десериализованы в соответствующие типы объектов. Имея следующие определения классов

[DataContract]
public class Post {
    [DataMember(Name = "content")]
    public String Content { get; set; }
}

[DataContract]
public class User {
    [DataMember(Name = "user_name")]
    public String UserName { get; set; }
    [DataMember(Name = "email")]
    public String Email { get; set; }
}

[DataContract]
public class Container {
    [DataMember(Name="posts_and_objects")]
    public List<Object> PostsAndUsers { get; set; }
}

как я могу обнаружить их и десериализовать как в соответствующий тип объекта, так и сохранить в свойстве PostsAndUsers?


person Oybek    schedule 05.07.2013    source источник
comment
Вы нашли решение?   -  person F Yaqoob    schedule 04.07.2014
comment
@FYaqoob К сожалению, нет. Мне пришлось придумать несколько пользовательских сериализаций/десерализаций с помощью JavaScriptSerializer. Однако некоторые говорят, что Newtonsoft.Json — хорошая штука, хотя мне не довелось с ней поработать.   -  person Oybek    schedule 08.08.2014


Ответы (1)


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

protected static Stream GetStream<T>(T content)
{
    MemoryStream memoryStream = new MemoryStream();
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T), new []{typeof(Post), typeof(User)});
    serializer.WriteObject(memoryStream, content);
    memoryStream.Seek(0, SeekOrigin.Begin);
    return memoryStream;
}

protected static T GetObject<T>(Stream stream)
{
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T), new[] { typeof(Post), typeof(User) });
    return (T)serializer.ReadObject(stream);
}

static void Main(string[] args)
{
    var container = new Container {PostsAndUsers = new List<object>()};
    container.PostsAndUsers.Add(new Post{Content = "content1"});
    container.PostsAndUsers.Add(new User{UserName = "username1"});
    container.PostsAndUsers.Add(new Post { Content = "content2" });
    container.PostsAndUsers.Add(new User { UserName = "username2" });

    var stream = GetStream(container);
    var parsedContainer = GetObject<Container>(stream);

    foreach (var postsAndUser in parsedContainer.PostsAndUsers)
    {
        Post post;
        User user;
        if ((post = postsAndUser as Post) != null) 
        {
            // is post
        }
        else if ((user = postsAndUser as User) != null) 
        {
            // is user
        }
        else
        {
            throw new Exception("");
        }
    }
}
person Jose M.    schedule 04.11.2014