Análisis de matriz JSON de varios niveles

Estoy tratando de obtener objetos de una matriz JSON de varios niveles. Esta es una tabla de ejemplo: array(2) {

  ["asd"]=>
  array(3) {
    ["id"]=>
    int(777)
    ["profile"]=>
    array(4) {
      ["username"]=>
      string(5) "grega"
      ["email"]=>
      string(18) "random@example.com"
      ["image"]=>
      string(16) "http...image.jpg"
      ["age"]=>
      int(26)
    }
    ["name"]=>
    string(5) "Grega"
  }
  ["be"]=>
  array(4) {
    ["username"]=>
    string(5) "grega"
    ["email"]=>
    string(18) "random@example.com"
    ["image"]=>
    string(16) "http...image.jpg"
    ["age"]=>
    int(26)
  }
}

La cadena a la que intento llegar es cualquiera de los correos electrónicos (ejemplo). Así es como lo pruebo:

public class getAsd
    {
        public string asd;
    }
    public class Profile
    {
        public string username { get; set; }
        public string email { get; set; }
        public string image { get; set; }
        public string age { get; set; }  
    }
}

Y luego usando JavaScriptSerilization.Deserilize<Asd>(jsonData); para deserilizarlo, pero cuando intento lo mismo con "Perfil", me da el siguiente error:

No parameterless constructor defined for type of 'System.String'.

JSON:

{"asd":{"id":777,"profile":{"username":"grega","email":"random@example.com","image":"http...image.jpg","age":26},"name":"Grega"},"be":{"username":"grega","email":"random@example.com","image":"http...image.jpg","age":26}}

¿Y idea de lo que podría estar mal?

preguntado el 03 de mayo de 12 a las 20:05

¿Puedes publicar el JSON real? -

Sí, igual que @Kroehre: lo anterior no es JSON. -

El JSON ni siquiera coincide estrechamente con sus objetos. Veamos qué podemos hacer. -

2 Respuestas

[EDIT: Smarm eliminado. OP agregó JSON en una edición.]

Su clase de perfil, como JSON, debe parecerse a lo siguiente.

{
    "username":"grega",
    "email":"random@example.com",
    "image":"http...image.jpg",
    "age":"26",
    "roles": [
        {"name": "foo"},
        {"name": "bar"}
    ]
}

array no debería aparecer en JSON a menos que sea parte de un nombre de propiedad ("codearray") o valor de la propiedad ("There's no 'array' in JSON. There's no 'array' in JSON.").

Las matrices de objetos en JSON están encerradas entre corchetes [] y delimitado por comas. Una matriz/colección de perfiles en JSON:

[
    {
        "username":"gretta",
        "email":"mrshansel@example.com",
        "image":"http...image.jpg",
        "age":"37",
        "roles": [
            {"name": "foo"},
            {"name": "bar"}
        ]
    },
    {
        "username":"methusaleh",
        "email":"old@men.org",
        "image":"http...image.jpg",
        "age":"2600",
        "roles": [
            {"name": "foo"},
            {"name": "},
            {"name": "bar"}
        ]
    },
    {
        "username":"goldilocks",
        "email":"porridge@bearshous.com",
        "image":"http...image.jpg",
        "age":"11",
        "roles": [
            {"name": "foo"}
        ]
    }
]

Si bien es posible que eso no responda completamente a su pregunta, ¿podría comenzar con eso y actualizar su pregunta?

EDITAR: Ver esta respuesta de Hexagonal para el abordaje completo.

contestado el 23 de mayo de 17 a las 11:05

Tiene su manera JSON al final. Es fácil pasarlo por alto y creo que editó la pregunta para incluirla. - Scottheckel

@Hexxagonal Así que lo hace... gracias. Creo que dejaré la explicación de JSON por ahora (hasta que/a menos que alguien me lo solicite), pero estoy votando tu respuesta. - devstruck

Muy bien, esto es lo que sería una versión "básica" de sus clases. Realmente debe seguir el estándar de tener propiedades con su primera letra en mayúscula. Como no hiciste esto antes, mantuve ese estilo.

public class Type1
{
    public TypeAsd asd { get; set; }
    public TypeBe be { get; set; }
}

public class TypeAsd
{
    public int id { get; set; }
    public TypeBe profile { get; set; }
    public string name { get; set; }
}

public class TypeBe
{
    public string username { get; set; }
    public string email { get; set; }
    public string image { get; set; }
    public int age { get; set; }
}

Su código de deserialización se vería así:

string jsonString = "{\"asd\":{\"id\":777,\"profile\":{\"username\":\"grega\",\"email\":\"random@example.com\",\"image\":\"http...image.jpg\",\"age\":26},\"name\":\"Grega\"},\"be\":{\"username\":\"grega\",\"email\":\"random@example.com\",\"image\":\"http...image.jpg\",\"age\":26}}";
JavaScriptSerializer serializer = new JavaScriptSerializer();
Type1 obj = serializer.Deserialize<Type1>(jsonString);

contestado el 03 de mayo de 12 a las 20:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.