Я делаю вызов POST, содержащий несколько массивов объектов, сериализованных с помощью JSON.stringify(). Когда я перехватываю полезную нагрузку в вызове API, я не уверен, как именно следует десериализовать данные для извлечения массивов. Вот несколько упрощенный код, иллюстрирующий мою проблему:
Модель PersonData и вызов POST
export class PersonData {
name: string;
age: number;
}
sendPersonData() {
const url = "http://localhost:5001/check-person-data";
let pd1 = new PersonData();
pd1.name = "Person1";
pd1.age = 1;
let pd2 = new PersonData();
pd2.name = "Person2";
pd2.age = 2;
let pd3 = new PersonData();
pd3.name = "Person3";
pd3.age = 3;
let pd4 = new PersonData();
pd4.name = "Person4";
pd4.age = 4;
var array1: PersonData[] = [pd1, pd2];
var array2: PersonData[] = [pd3, pd4];
let dictionary = {};
dictionary["Array1"] = array1;
dictionary["Array2"] = array2;
return this._http.post(url, JSON.stringify(dictionary), this.opts);
}
Класс PersonData и конечная точка API:
public class PersonData
{
string name;
int age;
}
[HttpPost("/check-person-data")]
public IActionResult CheckPersonData([FromBody] dynamic data)
{
// Need to take payload and pull out each array.
// THESE BOTH THROW ERRORS
var person1 = (PersonData[])data.Array1;
var person2 = data.Array2 as PersonData[];
return null;
}
Каков правильный способ получить каждый массив из объекта динамической строки JSON? Я не уверен, что мой метод помещения обоих массивов в 'let Dictionary = {}' и его преобразование в строку является хорошей практикой - это именно то, что легко работает для меня при отправке примитивов, таких как строки и числа. Если это не очень хорошая практика, что мне делать вместо этого?
Обновлено: Вот ошибки, которые я получаю для обеих строк:
'System.Text.Json.JsonElement' does not contain a definition for 'Array1'
'System.Text.Json.JsonElement' does not contain a definition for 'Array2'
Кроме того, полезная нагрузка имеет вид:
"{"Array1":[{"name":"Person1","age":1},{"name":"Person2","age":2}],
"Array2":[{"name":"Person3","age":3},{"name":"Person4","age":4}]}"





Вы можете использовать Dictionary<string, PersonData[]> вместо dynamic, а также в вашем классе PersonData name и age должны быть свойствами, чтобы это выглядело так
class PersonData {
public string name { get; set; }
public int age { get; set; }
}
но я бы рекомендовал написать это так, чтобы код был чище
class PersonData {
[JsonPropertyName("name")]
public string Name { get; set; }
[JsonPropertyName("age")]
public int Age { get; set; }
}
Таким образом, окончательный запрос будет выглядеть так
[HttpPost("/check-person-data")]
public IActionResult CheckPersonData([FromBody]Dictionary<string, PersonData[]> data)
{
return Ok();
}
Надеюсь, этот код вам поможет.
public IActionResult postData([FromBody] dynamic data)
{
var dataOut = JsonConvert.DeserializeObject<dynamic>(data.ToString());
var arr1 = dataOut.Array1;
var arr2 = dataOut.Array2;
return null;
}
Протестированный метод публикации, как показано ниже введите сюда описание изображения
Это сработало для меня. Чтобы преобразовать arr1 и arr2 из динамических в список объектов PersonData, я использовал следующее: List<PersonData> array1 = (List<PersonData>)arr1.ToObject(typeof(List<PersonData>));