Как десериализовать ответ, содержащий массив объектов с машинописью и сериализацией? - PullRequest
0 голосов

Я занимаюсь разработкой приложения для социальной сети, состоящего из API на основе Rails и веб-приложения Angular7.По сути, приложение Angular представляет собой веб-интерфейс к API.

Я использую библиотеку Typescript сериализации для сопоставления возврата API rails моим моделям Angular, цель состоит в том, чтобы отобразить ответ json из snake_case вcamelCase.

По сути, я могу десериализовать один объект, но не могу десериализовать массив объектов.

Конкретно в моем случае я пытаюсь войти в приложение, а затем сделать запрос на получение всех зарегистрированных дружеских отношений пользователя, из-за этого я смоделировал класс с именем CurrentUser, который соответствует имени входаresponse и Friendship, которые соответствуют ответу Friendship.

Вот один из ответов API и то, как я отображаю его на одну из моих моделей с библиотекой, в частности, эта модель отображает ответ процесса входа в систему:

Ответ:

loginResponse: {
   created_at: "2019-05-25T09:18:55.708-03:00"
   email: "diego@gmail.com"
   enabled: true
   expire_at: "2019-05-29T14:45:51.000-03:00"
   id: 2
   login: "Diego"
   name: "Diego"
   profile_id: 2
   token: "65zWGEea6M9DCn2PsL-z"

   user_image: {
      enabled: true
      id: 2
      public_image_path: "http://localhost:3000/images/users`
   }
}

Класс режима TS:

export class CurrentUser {
  // * ============================================
  // * Attributes
  // * ============================================
  @autoserialize id: number;
  @autoserialize name: string;
  @autoserialize email: string;
  @autoserialize  login: string;
  @autoserialize enabled: boolean;
  @autoserializeAs('profile_id') profileId: number;
  @autoserializeAs('created_at') createdAt: Date;

  @autoserialize token: string;
  @autoserializeAs('expire_at') expireAt: Date;

  @deserializeAs(UserImage, 'user_image')  userImage: UserImage;

  // * ============================================
  // * Methodds
  // * ============================================
  constructor() { }
}

Класс обслуживания TS, который выполняет запрос:

export class LoginService {
  // * ============================================
  // * Attributes
  // * ============================================
  private resourceLogin = 
  'http://localhost:3000/api/v1/logins';

  private resourceAuthToken = 
  'http://localhost:3000/api/v1/core_module/permission_module/authtokens';

  // * ============================================
  // * Methodds
  // * ============================================
  constructor(
    private http: HttpClient,
    private router: Router,
    private friendshipService: FriendshipService
  ) {}

  **THIS IS THE METHOD THAT PERFORMS THE REQUEST**
  public doLogin(login: Login): Observable<CurrentUser> {
    let httpParams = new HttpParams();
    httpParams = httpParams.set('login[email]', login.email.toString());
    httpParams = httpParams.set('login[password]', login.password.toString());

    return this.http
      .post<Login>(this.resourceLogin, httpParams)
      .pipe(map((data) => Deserialize(data, CurrentUser)));
  }
}

ThisПроцесс работы отлично, он преобразует все аннотированные свойства.Проблема возникает, когда я пытаюсь отобразить ответ метода, который запрашивает все зарегистрированные дружеские отношения с пользователем, я попробовал 2 способа написания кода.

Вот метод, который выполняет запрос дружбы к API:

// FIRST VERSION
public findUserFriendships(currentUser: CurrentUser): Observable<Friendship[]> {
    let httpParams = new HttpParams();
    httpParams = httpParams.set('user_friendships', 'true');
    httpParams = httpParams.set('user_id', currentUser.id.toString());

    return this.http
      .get<Friendship[]>(this.resourceFriendship, {params: httpParams})
      .pipe(map((data) => Deserialize(data, Friendship)));
  }


// SECOND VERSION
public findUserFriendships(currentUser: CurrentUser): Observable<Friendship[]> {
    let httpParams = new HttpParams();
    httpParams = httpParams.set('user_friendships', 'true');
    httpParams = httpParams.set('user_id', currentUser.id.toString());

    return this.http
      .get<Friendship[]>(this.resourceFriendship, {params: httpParams})
      .pipe(map((data) => data.map((item) => Deserialize(item, Friendship))));
  }

Я отлаживаю приложение с помощью термина отладчик, поэтому я в основном пишу отладчик в своем коде, и когда код достигает этой точки, приложение останавливается.

Через эту отладкуя смог выяснить, что когда я использую первую версию метода findUserFriendships, я получаю пустой объект Friendship, а когда я пользуюсь второй версией findUserFriendships, я ничего не получаю, я даже не останавливаюсь на отладчике;

В любом случае конечной целью является сопоставление всех объектов Дружбы в массиве Дружбы.

Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...