2013-04-15 9 views
6

Perché il seguente codice di ritorno "[]" quando deve restituire "{" id ": 1999, "title":" hithere "}Perché C# JavaScriptSerializer.Serialize tornare vuoti tra parentesi quadre

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 classe dg assomiglia a questo:..

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); 
    } 

Molte grazie

gRAZIE - RISPOSTO CON SUCCESSO - è stato l'IEnumerable che era la fonte dei miei guai per risolverlo, dg non si estende IEnumerable e tutti foreach (dg ...) i loop sono stati convertiti in loop for (int i = 0 ...).

GRAZIE MOLTO, MOLTO! JAMES ha capito perché è vuoto, Parv ha capito perché aveva parentesi quadre. Segnerebbe sia come risposta, ma può segnarne solo uno.

+0

'dg' =' [serializable] '? –

+0

dg ha un costruttore che corrisponde al sovraccarico nel tuo esempio e questo sovraccarico assegna correttamente i valori alle proprietà corrispondenti? – Dimitri

+0

@Brad - Ottengo lo stesso risultato con o senza il tag [Serializable] su dg – user2282496

risposta

4

Guardando il source il problema sembra essere una combinazione di un paio di cose.

Come @Parv ha già sottolineato la ragione che voi otteniate [] è perché la classe implementa IEnumerable così i tentativi serializzatore in iterate l'oggetto e quindi serializzare ogni elemento in modo indipendente. Il tuo progetto attuale non funzionerà in quanto non è progettato per serializzare le proprietà pubbliche per i tipi che implementano IEnumerable.

L'altro problema, come ho detto in un commento, è che la classe non sembra avere proprietà pubbliche, ciò che si ha al momento sono le variabili pubbliche. Per far funzionare il serializzatore hai bisogno di setter/getter di proprietà, ovvero

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

Il problema potrebbe essere che, poiché la classe dg eredita IEnumerable, il JavaScriptSerializer è trattare come un Array e quindi le parentesi quadre.

provare a fare

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

@James IEnumerable è un'interfaccia implementata per il tipo dg –

+0

molto interessante ... E stavo usando solo ienumerable per foreach loop – user2282496

Problemi correlati