JavaScriptSerializer Serialize por objeto anidado en c #

votos
1

He creado la clase de menú en varios niveles. Funciona bien. Pero ahora quiero clase Menu para convertir al objeto JSON para usar en AngularJS.

Tengo clase de dos clases

class Menu
{
    private List<Item> Items = new List<Item>();
}

class Item
{
    public int Id { get; set; }
    public int Level { get; set; }
    public string Title { get; set; }
    public string NavigateUrl { get; set; }
    public Menu Child { get; set; }
}`

Necesito crear objeto JSON de menú en el menú de clase contiene Listado de punto y la clase de artículo contiene Menú.

JavaScriptSerializer.Serialize trabajar con un solo nivel. ¿Tengo que poner en práctica cualquier tipo de interfaz o cambiar la clase en la serialización es posible?

Publicado el 14/01/2015 a las 16:15
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
2

Su principal problema parece ser que su clase Menu tiene una variable interna, privada que contiene la lista de objetos de elemento, y que la lista no es accesible por código externo.

El serializador Javascript sólo puede serializar propiedades públicas de una clase.

Si usted hace sus elementos de menú de acceso público usando una propiedad de captador ... algo como esto:

class Menu
{
    private List<Item> _items = new List<Item>();

    public List<Item> Items
    {
        get { return _items; }
        set { _items = value; }
    }
}

Deberia de funcionar.

Su Itemclase ya se compone de bienes de dominio público, por lo que debe serializar sin ningún problema.

Respondida el 14/01/2015 a las 16:37
fuente por usuario

votos
0

Si entiendo su pregunta, usted necesita hacer a continuación:

[DataContract]
public class Menu
{
    [DataMember]
    private List<Item> Items = new List<Item>();
}

[DataContract]
public class Item
{
    [DataMember]
    public int Id { get; set; }

    [DataMember]
    public int Level { get; set; }

    [DataMember]
    public string Title { get; set; }

    [DataMember]
    public string NavigateUrl { get; set; }

    [DataMember]
    public Menu Child { get; set; }
}

Y después de que se puede utilizar:

var menu = new Menu(); 
/* add items */ 
var serializer = new JavaScriptSerializer(); 
var serializedResult = serializer.Serialize(menu);

Corregir si me mal en alguna parte

Respondida el 14/01/2015 a las 18:41
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more