2011-11-20 37 views
12

Tôi chắc chắn câu hỏi này đã được hỏi hơn và hơn nữa, nhưng vì một lý do nào đó, tôi vẫn không thể quản lý để có được điều này để làm việc.Deserializing một mảng JSON đơn giản với DataContractJsonSerializer

Tôi muốn deserialize đối tượng JSON chứa một thành viên; một mảng chuỗi:

{"results" : ["a", "b"]} 

Đây là lớp học mà tôi đang cố gắng để deserialize thành:

public class Whatever { 
    [DataMember(Name = "results")] 
    public string[] Results { get; protected set; } 
} 

Và đây là phương pháp Deserialize:

private static T Deserialize<T>(string json) 
{ 
    var instance = Activator.CreateInstance<T>(); 
    using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(json))) 
    { 
     var serializer = new DataContractJsonSerializer(instance.GetType()); 
     return (T)serializer.ReadObject(ms); 
    } 
} 

Một cuộc gọi như Deserialize<Whatever>("{\"results\" : [\"a\", \"b\"]}") là trả lại phiên bản được khởi tạo là Whatever nhưng mảng Results đang ở null.

Có điều gì sai với cấu trúc của Whatever?

+11

Bạn không cần phải 'var dụ = Activator.CreateInstance (); 'sử dụng' typeof (T) ' –

Trả lời

12

Ah, sau khi công bố này, tôi nhận ra rằng tôi đã mất tích cách trang trí DataContract thuộc tính trên Whatever:

[DataContract] 
public class Whatever { 
    [DataMember(Name = "results")] 
    public string[] Results { get; protected set; } 
} 

Bây giờ nó hoạt động tốt.

+6

Cảm ơn. Nó cũng rất quan trọng để ánh xạ tên của các thành viên dữ liệu phân biệt chữ hoa chữ thường. Bạn đã làm điều đó, tuy nhiên tôi muốn nhấn mạnh điều này trong trường hợp ai đó cố gắng sử dụng DataContract và DataMember, nhưng quên thuộc tính Name (như tôi đã làm lần đầu tiên). – cudahead

+1

Bạn thật tuyệt vời !! –

8

tôi biết, bài đăng khá bị cấm; nhưng: cũng có thể trả về trực tiếp một danh sách các đối tượng lớp, nếu bạn có một chuỗi thông tin jsonarray để liên kết với một dataclass; tức là .:

List<SomeDataClass> filesToMove = new List<SomeDataClass>(); 

public T deserializeJSON<T>(string json) 
{ 
    var instance = typeof(T); 
    var lst = new List<SomeDataClass>(); 

    using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(json))) 
    { 
     var deserializer = new DataContractJsonSerializer(instance); 
     return (T)deserializer.ReadObject(ms); 
    } 
} 

someJsonArrayString = "[{\"ID\":7},{\"ID\":16}]"; 
filesToMove = deserializeJSON<List<SomeDataClass>>(someJsonArrayString); 
Console.WriteLine(filesToMove[1].ID); // returns 16 

với dataclass SomeDataClass.cs:

[DataContract] 
class SomeDataClass 
{ 
    [DataMember] 
    public int ID { get; set; }   
} 
+0

Có gì với Danh sách, ví dụ của bạn không hoạt động như bạn đã đăng. – Sebastian

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