@Yordi

Как скрыть ненужные поля в JSON-ответе используя Dapper?

Пишу REST API сервер на ASP.NET Core 2.1. В качестве ORM хочу использовать Dapper. Ранее разрабатывал лишь небольшие десктоп проекты для работы с БД.

Есть класс, соответствующий таблице в базе:
public class User
    {
        public int id { get; set; }
        public string FIO { get; set; }
        public int age { get; set; }
        public string city { get; set; }
        public string somedata1 { get; set; }
        public string somedata2 { get; set; }
        public string somedata3 { get; set; }
    }


Интрефейс:
public interface IUser
        {
            IEnumerable<User> GetUsers();
            IEnumerable<User> GetSomeData1();
            IEnumerable<User> GetSomeData2();
        }


Класс, его реализующий:
public class UserRepository : IUser
    {
        /* ... */

        public IEnumerable<User> GetUsers()
        {
            using (IDbConnection connection = GetConnection())
            {
                return connection.Query<User>("select id, fio, age, city, somedata1, somedata2, somedata3 from users");
            }
        }
    }


В классе контроллера использую метод из UserRepository:
[HttpGet]
        public IEnumerable<User> GetUsers()
        {
            return _userRepository.GetUsers();
        }


Получаю примерно такой JSON-ответ:
[{"id":1, "fio":"Иванов И. И.", "age":10, "city":"dc", "somedata1":"data1", "somedata2":"data2", "somedata3":"data3"}]


Хорошо. Как мне теперь реализовать метод GetSomeData1(), чтобы в JSON возвращать только те поля таблицы, которые я выберу в запросе? Не создавать же на каждый метод по несколько вариаций класса-сущности из базы?

Например, чтобы код:
public IEnumerable<User> GetSomeData1()
        {
            using (IDbConnection connection = GetConnection())
            {
                return connection.Query<User>("select id, fio, somedata3 from users where id in (1,2)");
            }
        }


вернул
[{"id":1, "fio":"Иванов И. И.", "somedata3":"data3"},
{"id":2, "fio":"Петров А. А.", "somedata3":null}]


вместо
[{"id":1, "fio":"Иванов И. И.", "age":null, "city":null, "somedata1":null, "somedata2":null, "somedata3":"data3"},
{"id":2, "fio":"Петров А. А.", "age":null, "city":null, "somedata1":null, "somedata2":null, "somedata3":null}]


Находил вариант с использованием атрибута
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
на поле класса-сущности, но, похоже, такой способ мне не подойдет, т.к. необходимо будет в том числе возвращать JSON с Null-полями.
  • Вопрос задан
  • 727 просмотров
Пригласить эксперта
Ответы на вопрос 1
devspec
@devspec
Помогло? Отметь решением
Как-то так
public class Car
{
  // included in JSON
  public string Model { get; set; }
  public DateTime Year { get; set; }
  public List<string> Features { get; set; }

  // ignored
  [JsonIgnore]
  public DateTime LastModified { get; set; }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы