Как передать кортеж с 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;
});  
→ Ссылка