Как передать кортеж с Postman в asp.net web api
Делаю систему заказов. Есть таккой вот тип:
public sealed record SmthRequest
{
public Guid WorkshopId { get; set; }
public Guid SupplyId { get; set; }
public List<(Guid id, int count)> MaterialIds { get; set; } = new List<(Guid, int)>();
}
Как правильно передать MaterialIds
используя Postman
или Swagger
?
UPD: сделал эндпоинт:
[HttpGet("get-tuple")]
public async Task<IActionResult> GetTuple() =>
Ok(new SmthRequest(
Guid.NewGuid(),
Guid.NewGuid(),
new List<(Guid id, int count)>()
{
(Guid.NewGuid(), 1),
(Guid.NewGuid(), 2),
(Guid.NewGuid(), 3),
(Guid.NewGuid(), 4),
(Guid.NewGuid(), 5),
}
));
При запросе получаю ответ:
{
"x1": "4d97ab93-bdca-421d-8549-122d5e1d42b9",
"x2": "c0a956d1-908a-495b-add6-2aca2941286a",
"x3": [
{},
{},
{},
{},
{}
]
}
Пробовал передавать такой вариант:
{
"WorkshopId": "5da98ac2-b589-4261-ad8c-8a0d21111dca",
"MaterialIds": [
{
"Item1": "41edd8f3-15c5-4259-bfab-c35b21a00d2f",
"Item2": 5
},
{
"Item1": "48c313c0-032a-4d59-9120-a17e98ab6ba9",
"Item2": 10
}
]
}
И такой:
{
"WorkshopId": "5da98ac2-b589-4261-ad8c-8a0d21111dca",
"MaterialIds": [
{
"id": "41edd8f3-15c5-4259-bfab-c35b21a00d2f",
"count": 5
},
{
"id": "48c313c0-032a-4d59-9120-a17e98ab6ba9",
"count": 10
}
]
}
И ни один из них не передаёт значение кортежа на сервер.
Ответы (1 шт):
Автор решения: aepot
→ Ссылка
Как-то так, используйте опцию сериализатора IncludeFields
.
static void Main(string[] args)
{
List<(Guid, int)> list = [
(Guid.NewGuid(), 1),
(Guid.NewGuid(), 2),
(Guid.NewGuid(), 3),
(Guid.NewGuid(), 4),
(Guid.NewGuid(), 5),
];
JsonSerializerOptions options = new() { IncludeFields = true, WriteIndented = true };
string json = JsonSerializer.Serialize(list, options);
Console.WriteLine(json);
var items = JsonSerializer.Deserialize<List<(Guid, int)>>(json, options);
foreach ((Guid guid, int number) in items)
{
Console.WriteLine($"{guid}, {number}");
}
}
Вывод в консоль
[
{
"Item1": "5ff7a2d3-98ea-4b9f-9df5-3fdb94a7807f",
"Item2": 1
},
{
"Item1": "5526be3c-a0ff-42dd-bbb3-844c97804f80",
"Item2": 2
},
{
"Item1": "da82a099-28c0-43ee-a61e-972737d5c816",
"Item2": 3
},
{
"Item1": "1ee23906-3c11-4992-a7ef-2387421a9e19",
"Item2": 4
},
{
"Item1": "ba06dd98-6da8-49e5-90d7-8bc02d740ff5",
"Item2": 5
}
]
5ff7a2d3-98ea-4b9f-9df5-3fdb94a7807f, 1
5526be3c-a0ff-42dd-bbb3-844c97804f80, 2
da82a099-28c0-43ee-a61e-972737d5c816, 3
1ee23906-3c11-4992-a7ef-2387421a9e19, 4
ba06dd98-6da8-49e5-90d7-8bc02d740ff5, 5
То есть в вашем случае решение выглядит так:
builder.Services.AddControllers().AddJsonOptions(options =>
{
options.JsonSerializerOptions.IncludeFields = true;
});