2013-03-04 2 views
1

Я пытаюсь понять, как создать класс C#, в который я могу десериализовать этот json. Может ли кто-нибудь указать мне в правильном направлении?Как я могу десериализовать этот JSON на объект C#?

Вот мой JSON

{ 
"0": { 
    "heading": "Home", 
    "link": "#", 
    "dropdown": {} 
}, 
"1": { 
    "heading": "About", 
    "link": "#", 
    "dropdown": { 
     "0": { 
      "name": "Programs", 
      "value": "programs" 
     }, 
     "1": { 
      "name": "Sample Page", 
      "value": "test" 
     }, 
     "2": { 
      "name": "Donations", 
      "value": "donations" 
     } 
    } 
}, 
"2": { 
    "heading": "Products", 
    "link": "#", 
    "dropdown": {} 
}, 
"3": { 
    "heading": "Contact Us", 
    "link": "#", 
    "dropdown": { 
     "0": { 
      "name": "Programs", 
      "value": "programs" 
     }, 
     "1": { 
      "name": "Donations", 
      "value": "donations" 
     } 
    } 
} 

}

Я попытался следующие, не повезло

public class Menu 
{ 
    public MenuItem MenuItems { get; set; } 
} 

public class MenuItem 
{ 
    public string Heading { get; set; } 
    public string Link { get; set; } 
    public DropDownMenu DropDownMenu { get; set; } 
} 

public class DropDownMenu 
{ 
    public string Name { get; set; } 
    public string Value { get; set; } 
} 

В моем контроллере я использую следующие попробовать и десериализации json в мой объект.

[HttpPost] 
public ActionResult AddMenu(string menuType, string menu, string menuTitle) 
{ 
    var serializer = new JavaScriptSerializer(); 
    var newMenu = serializer.Deserialize<Menu>(menu); 
    } 

Примечание: Переменная меню содержит строку JSON.

ответ

0

От ScottGu's blog:

ASP.NET MVC 3 включает в себя встроенную поддержку JSON связывания, которая позволяет методы действий получить JSON-кодированные данные и модель-привязать его к параметров метода действия.

Вместо того, чтобы получать параметр как string вы можете попробовать связывание запроса непосредственно к объекту (JSON модели связыванию):

[HttpPost] 
public ActionResult AddMenu(string menuType, Menu menu, string menuTitle) 
{ 
    // use menu here, no need to deserialize anything else 
    } 

Кроме того, убедитесь, что клиент отправляет тип содержимого запроса как JSON, например:

contentType: 'application/json; charset=utf-8', 

See Phil Haack's example

Here и here еще два.

+0

Deserialize не возьмет объект, он должен быть следующим. Deserialize (string); // это подпись функции. –

+0

Конечно, это работает, вы не возражаете, показывая мне документацию, в которой говорится иначе? Я добавил еще несколько примеров (включая ссылку на блог Фила Хакка), показывающие привязку модели json. – Ulises

+0

Добавлена ​​еще одна ссылка на блог ScottGu – Ulises

1

В вашем текущем JSON есть 4 пункта меню ... Я предполагаю, что это может измениться до 5 или 6, верно? ... если так ... ваш JSON неверен, вы должны использовать массив.

Что-то вроде:

[ 
{ 
    "heading": "Home", 
    "link": "#", 
    "dropdown": [] 
}, 
{ 
    "heading": "About", 
    "link": "#", 
    "dropdown": [ 
     { 
      "name": "Programs", 
      "value": "programs" 
     }, 
     { 
      "name": "Sample Page", 
      "value": "test" 
     }, 
     { 
      "name": "Donations", 
      "value": "donations" 
     } 
    ] 
}, 
{ 
    "heading": "Products", 
    "link": "#", 
    "dropdown": [] 
}, 
{ 
    "heading": "Contact Us", 
    "link": "#", 
    "dropdown": [ 
     { 
      "name": "Programs", 
      "value": "programs" 
     }, 
     { 
      "name": "Donations", 
      "value": "donations" 
     } 
    ] 
} 
] 

А затем определить свой класс:

public class MenuItem 
{ 
    public string heading 
    { 
     get; 
     set; 
    } 

    public string link 
    { 
     get; 
     set; 
    } 

    public DropDownMenu[] dropdown 
    { 
     get; 
     set; 
    } 
} 

public class DropDownMenu 
{ 
    public string Name 
    { 
     get; 
     set; 
    } 
    public string Value 
    { 
     get; 
     set; 
    } 
} 

Затем вы можете десериализации ваш JSON как "массив MenuItems" ... как:

var ser = new JavaScriptSerializer(); 
var newMenu = ser.Deserialize<MenuItem[]>(json); 

Надеюсь, что это поможет,

Daniel.

+0

Это приводит к исключению, в котором указано, что для MenuItem [] нет конструктора без параметров. Если я его определяю, я все равно получаю исключение. –

+0

Я только что протестировал сайт Mvc 4 (.Net 4.5), и он отлично работает. Вы можете увидеть это в этом прогнозе: http://screencast.com/t/slucdqpK5 – Daniel

Смежные вопросы