Задать вопрос
@Atlant1Q

Как десериализовать запрос?

С фронта приходит вот такой запрос:

[{"form_name":"form1","value":"buy"},{"form_name":"form2","value":"osago"},{"form_name":"form3","value":"msk"},{"form_name":"form6","value":{"name":"вапрпва","phone":"+7 (999) 999-99-99","date":"02.02.2018","time":"16:00 - 17:00","comment":""}}]

десериализую вот так:
ActionResult Test(FormCollection collection){
string request = collection["test"]; //в request вышеуказанный запрос
var req = JsonConvert.DeserializeObject<List<Form>>(request);


Класс формы:

public class Form
{
public string form_name { get; set; }
public string value { get; set; }
}


до тех пор, пока не приходит form6 cо сложным значением, всё нормально. Подскажите, как правильно сделать десериализацию, чтобы получилось разобрать value при form6 ?
  • Вопрос задан
  • 44 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
@kttotto
пофиг на чем писать
Вариантов несколько.

Первый, это как написано постом выше, привести к dynamic. Но у этого варианта есть недостаток - в каждый момент надо знать какое поле пришло, иначе получите эксепшин на уровне рантайма. Но знать это, по видимому, не реально.

Второй, это преобразовать к
public string form_name { get; set; }
public object value { get; set; }

В принципе это почти тот же вариант что и первый, ибо дайнемик это тот же обжект, просто на уровне компиляции не проходит проверки типов. А затем value приводить к заранее известному типу, сделать switch, чтобы логика была как то так
response.value = response.value as string;
if(response.value == null)
{
     response.value = response.value as SomeClass;
     if(response.value == null)
     {
         response.value =  response.value as OtherClass;
   ....

Но у этого способа тоже есть недостаток, нужно точно знать какие типы могут приходить в value.

И третий вариант, это привести value к JObject и уже руками вытягивать нужные узлы со значением.

PS. И еще, не рекомендовал бы именовать модель подстраиваясь под json. Для этого у newton есть нужные атрибуты
public class Form
{
	[PropertyName = "form_name")]
	public string FormName { get; set; }
	
	[PropertyName = "value")]
	public string Value { get; set; }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы