2013-04-15 41 views
6

Tại sao sự trở lại đoạn mã sau "[]" khi nó trở nên "{" id ": Năm 1999, "title":" hithere "}tại sao C# JavaScriptSerializer.Serialize trở dấu ngoặc vuông trống

JavaScriptSerializer serializer = new JavaScriptSerializer(); 
    StringBuilder sbJsonResults = new StringBuilder(); 
    var result = serializer.Serialize(new dg(1999, "hithere")); 

    context.Response.Clear(); 
    context.Response.ContentType = "application/json; charset=utf-8"; 
    context.Response.Cache.SetExpires(DateTime.MinValue); 
    context.Response.Write(result); 

PS lớp dg trông như thế này:..

public class dg : ScheduleObserver, ILibrary, IEnumerable { 
     public int id; 
     public string title; 
     private List<d> dList; 
     ...many getters and setters and some logic functions... 
    } 

    public abstract class ScheduleObserver{ 
     public abstract void update(); 
    } 

    public interface ILibrary { 
     List<PD> getPDs(); 
     void setPDs(List<PD> newPDs); 
     int getCurrentIndex(); 
     void addPD(PD pD); 
     PD getPD(int index); 
    } 

Rất cám ơn

tHANKS - TRẢ LỜI THÀNH CÔNG - đó là IEnumerable đó là nguồn gốc của tai ương của tôi Để giải quyết nó, dg không còn kéo dài IEnumerable và tất cả foreach (dg ...) các vòng lặp đã được chuyển đổi thành vòng lặp (int i = 0 ...).

THANKS VERY, VERY MUCH! JAMES có lý do tại sao trống rỗng của nó, Parv có lý do tại sao có dấu ngoặc vuông. Đánh dấu cả hai là câu trả lời nhưng chỉ có thể đánh dấu một câu trả lời.

+0

'dg' =' [serializable] '? –

+0

hiện dg có một constructor phù hợp với tình trạng quá tải trong ví dụ của bạn và không quá tải đúng cách gán giá trị cho các thuộc tính tương ứng? – Dimitri

+0

@Brad - Tôi nhận được kết quả tương tự có hoặc không có thẻ [Serializable] trên dg – user2282496

Trả lời

4

Nhìn vào source vấn đề sẽ xuất hiện như một sự kết hợp của một vài điều.

Như @Parv đã chỉ ra lý do bạn nhận được [] là bởi vì lớp học của bạn thực hiện IEnumerable nên những nỗ lực serializer để lặp đối tượng và sau đó serialize từng hạng mục một cách độc lập. Thiết kế hiện tại của bạn sẽ không hoạt động vì nó không được thiết kế để tuần tự hóa các thuộc tính công khai cho các loại thực hiện IEnumerable.

Vấn đề khác, như tôi đã đề cập trong nhận xét, là lớp của bạn dường như không có bất kỳ thuộc tính công khai nào, những gì bạn có tại thời điểm này là công khai biến số. Để trình serializer hoạt động, bạn cần thuộc tính setter/getters tức là

public class dg 
{ 
    public int id { get; set; } 
    public string title { get; set; } 
    ... 
} 
3

Sự cố có thể là do lớp dg được thừa hưởng IEnumerable, JavaScriptSerializer coi nó là Array và do đó là dấu ngoặc vuông.

Hãy thử làm

var result = serializer.Serialize(
    new dg(1999, "hithere").Select(d => new{ id = d.id, title = d.title })); 
+0

@James IEnumerable là Giao diện được triển khai cho Loại dg –

+0

rất tuyệt ... Và tôi chỉ sử dụng ienumerable cho vòng lặp foreach – user2282496

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