2012-07-11 34 views
8

Tôi có một cấu trúc json mà trông giống như sau:deserializing JSON thành một trong vài C# lớp con

"list":[ 
    { 
    "type":"link", 
    "href":"http://google.com" 
    }, 
    { 
    "type":"image", 
    "src":"http://google.com/logo.png" 
    }, 
    { 
    "type":"text", 
    "text":"some text here" 
    }, 
] 

Tôi muốn deserialize này vào một danh sách các đối tượng, trong đó mỗi đối tượng là một lớp con của một cơ sở lớp học. Mỗi mục trong danh sách có các thuộc tính khác nhau (href, src, văn bản), vì vậy tôi không thể sử dụng cùng một lớp để đạt được một. Thay vào đó, tôi muốn có ba lớp con của một lớp học chung. Thuộc tính type của mỗi mục trong danh sách JSON có thể được sử dụng để quyết định lớp con nào sẽ sử dụng. Ví dụ: tôi có thể có các lớp học sau đây

public Item{ 
    public string type {get; set;} 
} 
public LinkItem : Item { 
    public string href {get; set;} 
} 
public ImageItem : Item { 
    public string src {get; set;} 
} 
public TextItem : Item { 
    public string text {get; set;} 
} 

Có cách nào để thực hiện việc này không? Hoặc là có một cách tốt hơn để deserialize một danh sách các loại đối tượng không đồng nhất?

EDIT:

Tôi đang sử dụng json.net bằng cách

+0

Cách tạo lớp có tất cả các thuộc tính. Deserialize để có được một danh sách các cá thể lớp đó. Sau đó, lọc dựa trên loại và dự án các thuộc tính cần thiết để tạo các trường hợp chuyên biệt. Giả sử đây là những gì bạn đang làm, và đang tìm kiếm một cách tốt hơn? –

+0

Khi ứng dụng phát triển sự phức tạp của các mục riêng lẻ có thể tăng lên, và có vẻ như một ý tưởng tồi để có một lớp cơ sở với mọi thuộc tính có thể có trong đó. Những gì tôi đang xem xét là sử dụng một đối tượng vô danh, và sau đó tạo ra một thể hiện sau này dựa trên loại. – Marius

+0

Tôi không có nghĩa là một lớp cơ sở. Tôi đã suy nghĩ nhiều hơn về lớp dto trung gian mà có tất cả các tùy chọn có thể. Từ một danh sách các đối tượng dto, bạn có thể định hình các đối tượng yêu cầu của bạn. Bằng cách đó, tên miền của bạn không bị lẫn lộn với các mối quan tâm tuần tự hóa. Điều đó nói rằng, bạn có thể sử dụng đối tượng năng động? Tôi đã không nhận ra các loại vô danh có thể cho phép bạn không xác định các thuộc tính nhất định ... Như trong các thuộc tính của đối tượng anon deserialized đầu tiên không phải là các thuộc tính giống nhau mà đối tượng aner deserialized thứ hai sẽ có. –

Trả lời

1

Như @AmithGeorge gợi ý, bạn có thể sử dụng một đối tượng dynamic để tự động phân tích đối tượng json của bạn. Bạn có thể sử dụng this great dynamic class for JSON by Shawn Weisfeld. Here is his blog explaining how he do it.

JavaScriptSerializer jss = new JavaScriptSerializer(); 
jss.RegisterConverters(new JavaScriptConverter[] { new DynamicJsonConverter() }); 

dynamic glossaryEntry = jss.Deserialize(json, typeof(object)) as dynamic; 

Console.WriteLine("glossaryEntry.glossary.title: " + glossaryEntry.glossary.title); 
Console.WriteLine("glossaryEntry.glossary.GlossDiv.title: " + glossaryEntry.glossary.GlossDiv.title); 
Console.WriteLine("glossaryEntry.glossary.GlossDiv.GlossList.GlossEntry.ID: " + glossaryEntry.glossary.GlossDiv.GlossList.GlossEntry.ID); 
Console.WriteLine("glossaryEntry.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.para: " + glossaryEntry.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.para); 
foreach (var also in glossaryEntry.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso) 
{ 
    Console.WriteLine("glossaryEntry.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso: " + also); 
} 
+0

Liên kết đã chết . Bạn có thể tìm và đăng lại không? - Cảm ơn! –

+0

@DanVioletSagmiller Tôi rất tiếc, tôi nghĩ rằng anh ấy đã xóa kho lưu trữ của mình. Bạn vẫn có thể làm theo hướng dẫn trên [link] thứ hai của tôi (http://www.drowningintechnicaldebt.com/ShawnWeisfeld/archive/2010/08/22/using-c-4.0-and-dynamic-to-parse-json.aspx) Tuy nhiên. –

Các vấn đề liên quan