2013-05-25 28 views
8

Tôi có một mảng đối tượng có chứa chuỗi và chờ đợi và lớp này:deserializing object [] chứa các kiểu dữ liệu và một kiểu lớp

public class SimpleMailAddress 
{ 
    public string Address { get; set; } 
    public string Name { get; set; } 

    public static implicit operator MailAddress(SimpleMailAddress m) 
    { 
     return new MailAddress(m.Address, m.Name); 
    } 
} 

Tuy nhiên, khi deserializing mảng JSON với Json.Net, tôi nhận được loại ẩn danh chứa AddressName thay vì đối tượng SimpleMailAddress.

Tôi không muốn tạo đối tượng được nhập mạnh để deserialize thành vì nó sẽ không được tái sử dụng và tôi sẽ phải tạo ra rất nhiều đối tượng cho nó. Có cách nào để làm điều này với Json.Net hay bất kỳ thư viện nào khác không?

Đây là cách tôi serializing/deserializing:

var json = JsonConvert.SerializeObject(myObject); 
var myObject = JsonConvert.DeserializeObject<MailMessageRequest>(json); 

MailMessageRequest:

public class MailMessageRequest 
{ 
    public string Mailer { get; set; } 
    public string Method { get; set; } 
    public object[] Args { get; set; } 
} 
+1

Bạn có thể đăng mã cho biết cách bạn sắp xếp và deserialize – cheedep

+0

@cheedep - Sure, added. –

+0

Bạn cũng có thể thêm mẫu Json không? Và tôi nghĩ câu hỏi của bạn hơi không rõ ràng. Chính xác là bạn đang cố đạt được điều gì? Bạn có muốn deserialize vào đối tượng vô danh hoặc 'SimpleMailAddress'? –

Trả lời

4

Json không chứa bất kỳ kiến ​​thức kế thừa về lớp SimpleMailAddress của bạn. Vì vậy, khi bạn đang nói với nó để deserialize, thực tế là tài sản Args của bạn là loại Object, deserializer đang làm tốt nhất có thể (bằng cách tạo ra một loại vô danh). Nó chỉ thấy dữ liệu, nó không có kiến ​​thức rằng bạn muốn có một đối tượng SimpleMailAddress.

Json.net có lớp JObject. Hãy thử sử dụng thay vì Object cho tham số Args của bạn nếu nội dung thực tế của Args có thể thay đổi kiểu.

Sau đó, khi cần, bạn có thể đọc dữ liệu từ đối tượng JObject.

Nếu bạn không quan tâm đến nội dung thực tế của các Arg, thì hãy để nó là Object và bỏ qua nó.

Chỉnh sửa: JSon.Net có thể nhúng thông tin loại trong quá trình tuần tự hóa có thể được sử dụng trong quá trình deserialization.

Để thông số Args của bạn dưới dạng Object. Sau đó, sử dụng tùy chọn TypeNameHandling của All trong cả hai quá trình tuần tự hóa và deserialization.

var json = JsonConvert.SerializeObject(myObject, Formatting.None, 
    new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }); 
var myObject = JsonConvert.DeserializeObject<MailMessageRequest>(json, 
    new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }); 

Bạn nên kết thúc với đối tượng Args của bạn như mong muốn SimpleMailAddress đối tượng của bạn.

+1

Tôi đã cố gắng deserializing bằng cách sử dụng 'JsonConvert.SerializeObject (cơ thể, Formatting.None, mới JsonSerializerSettings {TypeNameHandling = TypeNameHandling.All})' là tốt, trong đó xác định các loại, nhưng nó vẫn deserializes nó vào một 'JObject'. –

+0

Tôi đã cập nhật câu trả lời của mình ở trên. –

+0

Ahh, ngọt ngào, làm việc tốt. Tôi figured rằng cũng giống như bạn đã làm;) Tôi thực sự không chắc chắn nếu tôi cần 'TypeNameAssemblyFormat' mà tôi bao gồm, mặc dù. –

0

Bộ nối tiếp dữ liệu được xây dựng trong khuôn khổ the.net có khái niệm về các loại đã biết nơi bạn cho chúng biết loại nào mong đợi và sử dụng chúng trong quá trình deserialization.

Có bộ nối tiếp hợp nhất dữ liệu Json nhưng tôi không chắc nó sẽ tương thích với dữ liệu Json của bạn, nó có thể cần phải được tuần tự hóa và deserialized qua bộ nối tiếp datacontract để làm việc sử dụng phương pháp này.

0

OK. Tôi phải sử dụng các cài đặt này:

var settings = new JsonSerializerSettings 
       { 
        TypeNameHandling = TypeNameHandling.All, 
        TypeNameAssemblyFormat = FormatterAssemblyStyle.Full 
       }; 
var json = JsonConvert.SerializeObject(object, Formatting.None, settings); 
var object = JsonConvert.DeserializeObject<MailMessageRequest>(message.Body, settings); 
Các vấn đề liên quan