3

我打算使用DataContractJsonSerializer進行JSON序列化/反序列化。DataContractJsonSerializer包含元素類型的子類型的通用列表

我在JSON數組中有兩個對象類型,並希望它們都被反序列化爲相應的對象類型。 具有下列類defnitions

[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屬性相應的對象類型和存儲?

+0

你找到解決辦法嗎? –

+0

@FYaqoob不幸的沒有。我不得不用JavaScriptSerializer來實現一些自定義的序列化/解密。然而,有人說Newtonsoft.Json是一個好東西,儘管我沒有機會使用它。 – Oybek

回答

0

如果特定的已知類型可以序列和反序列化類容器,試試這個代碼:

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(""); 
     } 
    } 
} 
相關問題