Rxjs - отображение из json в интерфейс машинописного текста - PullRequest
0 голосов
/ 31 августа 2018

Итак, поскольку я изучал это новое пространство, мне нужно было сделать вызов Web API. Существует много путаницы между версиями всего. Во всяком случае, я нашел что-то, что работает, и я знаю, что «лучшие практики» слишком субъективны. Однако я не знаю, существует ли более прямой способ сделать это.

Вот формат ответа, который я ищу:

export interface AuditDetail {
  updatedAt: Date;
  updatedBy: string;
}

Вот модель на стороне сервера:

[DataContract]
public class PlanHistory
{
    [Key]
    public int Id { get; set; }

    [DataMember]
    [MaxLength(50)]
    public string UpdatedBy { get; set; }

    [DataMember]
    public DateTime UpdatedAt { get; set; }
}

А вот мой угловой сервис:

getAuditDetails(planId: number, fieldName: string, fieldValue: string): Observable<AuditDetail> {
    //return of({ updatedAt: new Date(), updatedBy: "Hawchorn" }); //Tooltip displays data

    interface PlanHistory    //Created because couldn't figure out how to directly map from Json to an Audit Detail. 
    {
      UpdatedAt: Date;
      UpdatedBy: string;
    }

    this.log("Retrieving Audit Details");
    return this.http
      .get<PlanHistory>(this.webApiUrl +
        "PlanHistories?planId=" +
        planId +
        "&fieldName=" +
        fieldName +
        "%20&fieldValue=" +
        fieldValue).pipe(map((response: PlanHistory) => {
          return <AuditDetail>{ updatedAt: response.UpdatedAt, updatedBy: response.UpdatedBy };
      }));
  }

Это работает. Но я ненавижу делать этот промежуточный интерфейс.

Так как мне сделать то же самое, прямо из JSON в AuditDetail?

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Отображение должно быть выведено, единственное отличие - ваш регистр, не могли бы вы обновить, чтобы имена совпадали?

0 голосов
/ 31 августа 2018

Вы хотите, чтобы Web API возвращал выходные данные camelCasing, поэтому вам не нужно менять корпус. См. Сериализация JSON и XML в ASP.NET Web API :

Чтобы написать имена свойств JSON с верблюжьей оболочкой, не меняя модель данных, установите CamelCasePropertyNamesContractResolver на сериализатору:

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

Тогда ваш код становится:

getAuditDetails(planId: number, fieldName: string, fieldValue: string): Observable<AuditDetail> {
    this.log("Retrieving Audit Details");
    return this.http
        .get<AuditDetail>(`${this.webApiUrl}PlanHistories?planId=${planId}&fieldName=${fieldName}%20&fieldValue=${fieldValue}`);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...