Есть ли способ сделать привязку вложенной модели с атрибутом [FromBody]? - PullRequest
0 голосов
/ 09 мая 2019

Я пытаюсь выполнить запрос POST с объектом JSON в качестве тела. Объект JSON содержит вложенные типы, которые являются предопределенными моделями в библиотеке, которую я использую, но когда я использую атрибут [FromBody], связывается только корневая модель, а вложенные модели равны нулю.

Я пробовал без использования атрибута [FromBody], но он также связывает только модель корневого уровня.

Пример объекта POST: Foo будет моделью, которая принимает объект Bar. Бар будет моделью, которая имеет свойства name и firstLetter.

{
  "foo": [
    {
      "bar": {
        "name": "bar",
        "firstLetter": "b"
      }
    },
    {
      "bar": {
        "name": "bar1",
        "firstLetter": "b"
      }
    }
  ]
}

Маршрут контроллера выглядит так:

[HttpPost("example-route")]
public async Task<ActionResult<string>> Static([FromBody]Request request){
 //Some Action
}

Класс Request будет выглядеть так:

//Request class
public class Request{
  [JsonConstructor]
  public Request(Bar b){
    this.Bar = b;
  }  

  public List<Bar> Bar = { get; set; }
}

//Bar class
public class Bar {

  public Bar(string name, string firstLetter){
     this.Name = name;
     this.FirstLetter = firstLetter;
  }

  public string Name { get; set; }
  public string FirstLetter { get; set; }

}

Когда я вызову это, Bar будет назначен, но его свойства Name и FirstLetter все равно будут нулевыми.

Редактировать: я добавлю список в примере, но я могу упростить. Фактический запрос выглядит примерно так:

{
    "prop1": "field1",
    "prop2": "4",
    "prop3": {
        "userId": "2",
        "customerId": "4",
        "type": {
            "userType": "Manager",
            "contactInfo": [
                {
                    "system": "email",
                    "value": "test@test.com"
                },
                {
                    "system": "phone",
                    "value": "555-555-5555"
                }
            ]
        }
    }
}

Где prop1, prop2, prop3, type и contactInfo - все модели, определенные в библиотеке, которую я использую. Я пытаюсь получить объект ContactInfo, и до сих пор он может назначить два объекта ContactInfo, когда я прохожу, но их свойства (система и значение) оба равны нулю. Я проверил орфографию и регистр, но проблем там нет.

1 Ответ

3 голосов
/ 09 мая 2019

Ваш класс Request должен точно соответствовать тому, что есть в JSON, и позаботиться о вложениях:

public class Request
{
  public List<BarContainer> foo {get; set;}
  // Your constructor should initialize this list.
}

public class BarContainer
{
  public Bar bar {get; set;}
}

public class Bar
{
  [JsonProperty("name")]
  public string Name { get; set;}
  [JsonProperty("firstLetter")]
  public string FirstLetter { get; set;}
}

ПРИМЕЧАНИЕ: десериализация чувствительна к регистру, поэтому вам нужно использовать точные имена в JSON, bar, foo, name, firstLetter или использовать атрибуты или конфигурацию для поддержки другого корпуса имена свойств:

...