2012-05-03 3 views
1

Я пытаюсь получить объекты из многоуровневого массива JSON. Это пример таблицы: массив (2) {Parsing многоуровневый массив JSON

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

Строка Я пытаюсь достичь либо из электронных писем (пример). Это, как я попробовать:

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

а затем с помощью JavaScriptSerilization.Deserilize<Asd>(jsonData); к deserilize, но когда я пытаюсь то же самое с «Профиль», он дает мне следующую ошибку:

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

JSON:

{"asd":{"id":777,"profile":{"username":"grega","email":"[email protected]","image":"http...image.jpg","age":26},"name":"Grega"},"be":{"username":"grega","email":"[email protected]","image":"http...image.jpg","age":26}} 

И идея, что может быть неправильным?

+0

Можете ли вы опубликовать фактическое JSON? – kroehre

+0

Да, так же, как @Kroehre - выше не JSON. – Tejs

+0

JSON даже не закрывает ваши объекты. Давайте посмотрим, что мы можем сделать. – scottheckel

ответ

2

[EDIT: Smarm удален. OP действительно добавлял JSON в редактирование.]

Ваш класс профиля, как JSON, должен напоминать следующее.

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

array не должны отображаться в формате JSON, если его часть имени свойства ("codearray") или стоимости имущества ("There's no 'array' in JSON. There's no 'array' in JSON.").

Массивы объектов в JSON заключены в квадратные скобки [] и разделены запятой. Массив/коллекция профилей в формате JSON:

[ 
    { 
     "username":"gretta", 
     "email":"[email protected]", 
     "image":"http...image.jpg", 
     "age":"37", 
     "roles": [ 
      {"name": "foo"}, 
      {"name": "bar"} 
     ] 
    }, 
    { 
     "username":"methusaleh", 
     "email":"[email protected]", 
     "image":"http...image.jpg", 
     "age":"2600", 
     "roles": [ 
      {"name": "foo"}, 
      {"name": "}, 
      {"name": "bar"} 
     ] 
    }, 
    { 
     "username":"goldilocks", 
     "email":"[email protected]", 
     "image":"http...image.jpg", 
     "age":"11", 
     "roles": [ 
      {"name": "foo"} 
     ] 
    } 
] 

Хотя это не может полностью ответить на ваш вопрос, не могли бы вы начать с этого и обновить свой вопрос?

EDIT: См. this answer by Hexxagonal для полного подхода.

+0

У него есть способ JSON в конце. Легко пропустить, и я думаю, он отредактировал вопрос, чтобы вставить его. – scottheckel

+0

@Hexxagonal Итак, он делает ... спасибо. Я думаю, что сейчас я оставлю объяснение JSON (пока/пока кто-то не попросит меня вытащить его), но я отвечу на ваш ответ. – devstruck

+0

Нет, определенно держите его. – scottheckel

1

Хорошо, вот что такое «базовая» версия ваших классов. Вы должны действительно следовать стандарту, когда свойства имеют свою первую букву с заглавной буквы. Поскольку вы не делали этого раньше, я поддерживал этот стиль.

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

Вы код десериализации будет выглядеть примерно так:

string jsonString = "{\"asd\":{\"id\":777,\"profile\":{\"username\":\"grega\",\"email\":\"[email protected]\",\"image\":\"http...image.jpg\",\"age\":26},\"name\":\"Grega\"},\"be\":{\"username\":\"grega\",\"email\":\"[email protected]\",\"image\":\"http...image.jpg\",\"age\":26}}"; 
JavaScriptSerializer serializer = new JavaScriptSerializer(); 
Type1 obj = serializer.Deserialize<Type1>(jsonString); 
Смежные вопросы