возвращайте пользовательский ответ json с использованием строго типизированной модели

#c# #json #.net-core

Вопрос:

Мой класс модели ответа

 public class MyModel
{
   public Tuple<string, string> Data{ get; set; }
}

var data = new MyModel
{
   Data = Tuple.Create("error", "12345");
};
 

что приводит к следующему ответу json

  {
  "data": {
    "item1": "error",
    "item2": "12345"
  }
}
 

Что я хочу, так это создать ответ следующим образом

  "data" : [{ "error" : "12345" }] 
 

Это item1 и item2 , конечно, динамические данные, и это может быть что угодно типа string. Я говорю это, потому что я не могу просто украсить свойства JsonProperty атрибутом.

Комментарии:

1. Есть ли причина, по которой это кортеж? Похоже, что массив keyvaluepair послужил бы вам лучше.

2. @BenMatthews KeyValuePair по умолчанию не будет сериализован в необходимый формат.

3. Я упускаю какую-то сложную часть здесь. Зачем использовать кортеж, когда желаемый результат-это что-то другое.

4. @GuruStron Ах, вы абсолютно правы. Моя ошибка.

Ответ №1:

Вам нужно либо реализовать пользовательский сериализатор для вашего кортежа, либо изменить модель, чтобы она представляла желаемую структуру. Если вы не хотите создавать какие-то конкретные типы для своих внутренних данных, вы можете использовать Dictionary соглашение о сериализации:

 public class MyModel
{
   public Dictionary<string, string>[] Data{ get; set; }
}
 

И творение:

 var data = new MyModel
{
    Data = new[]
    {
        new Dictionary<string, string> { { "error", "message" } }
    }
};
 

Или превратите свое поле в массив объектов и создайте анонимные:

 public class MyModel
{
   public object[] Data{ get; set; }
}
 
 var data = new MyModel
{
    Data = new[]
    {
        new { error = "message" } 
    }
}