2011-12-14 34 views
64

json.net (newtonsoft)
Tôi đang xem qua tài liệu nhưng tôi không thể tìm thấy bất cứ điều gì về điều này hoặc cách tốt nhất để làm điều đó.Json.net serialize/deserialize có nguồn gốc các loại?

public class Base 
{ 
    public string Name; 
} 
public class Derived : Base 
{ 
    public string Something; 
} 

JsonConvert.Deserialize<List<Base>>(text); 

Bây giờ tôi có các đối tượng gốc trong danh sách được tuần tự hóa. Làm thế nào để tôi deserialize danh sách và lấy lại các loại có nguồn gốc?

+0

Đó không phải là cách thức hoạt động của kế thừa. Bạn có thể chỉ định JsonConvert.Deserialize (văn bản); để bao gồm trường Tên. Kể từ khi có nguồn gốc ** là một cơ sở ** (không phải là cách khác xung quanh), Base không biết gì về định nghĩa của Derived. –

+0

Xin lỗi, đã làm rõ một chút. Vấn đề là tôi có một danh sách chứa cả các đối tượng cơ bản và có nguồn gốc. Vì vậy, tôi cần phải tìm hiểu làm thế nào tôi nói với newtonsoft làm thế nào để deserialize các mục có nguồn gốc. – Will

+0

Tôi đã giải quyết vấn đề này. Tôi có cùng một vấn đề –

Trả lời

26

Nếu bạn đang lưu trữ loại trong số text (như bạn phải ở trong trường hợp này), bạn có thể sử dụng JsonSerializerSettings.

Xem: how to deserialize JSON into IEnumerable<BaseType> with Newtonsoft JSON.NET

+14

Bạn cũng có thể sử dụng 'TypeNameHandling = TypeNameHandling.Auto' - điều này sẽ thêm thuộc tính' $ type' ONLY cho các trường hợp kiểu khai báo (tức là 'Base') không khớp với kiểu cá thể (tức là' Derived '). Bằng cách này, nó không bloat JSON của bạn nhiều như 'TypeNameHandling.All'. –

+0

Tôi tiếp tục nhận được lỗi khi giải quyết loại được chỉ định trong JSON '..., ...'. Đường dẫn '$ type', dòng 1, vị trí 82. Bất kỳ ý tưởng nào? – Crasher

67

Bạn phải kích hoạt Loại Tên Xử lý và vượt qua mà đến (de) serializer như một tham số cài đặt.

Base object1 = new Base() { name = "Object1" }; 
Derived object2 = new Derived() { something = "Some other thing" }; 
List<Base> inheritanceList = new List<Base>() { object1, object2 }; 

JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }; 
string Serialized = JsonConvert.SerializeObject(inheritanceList, settings); 
List<Base> deserializedList = JsonConvert.DeserializeObject<List<Base>>(Serialized, settings); 

Điều này sẽ dẫn đến việc desirialization các lớp dẫn xuất. Một nhược điểm của nó là nó sẽ đặt tên cho tất cả các đối tượng bạn đang sử dụng, vì vậy nó sẽ đặt tên cho danh sách bạn đang đặt các đối tượng vào.

+22

+1. Tôi đã googling trong 30 phút cho đến khi tôi thực sự phát hiện ra rằng bạn cần phải sử dụng cùng một cài đặt cho SerializeObject & DeserializeObject. Tôi cho rằng nó sẽ sử dụng $ type ngầm nếu nó ở đó khi deserializing, ngớ ngẩn tôi. –

+14

'TypeNameHandling.Auto' sẽ làm điều đó quá, và đẹp hơn vì nó không viết tên kiểu cá thể khi nó khớp với kiểu trường/thuộc tính, thường là trường hợp cho hầu hết các trường/thuộc tính. –

+0

Cảm ơn bạn đã tiết kiệm trong ngày :) –

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