【问题标题】:Convert a json value to a enum value将 json 值转换为枚举值
【发布时间】:2020-10-07 07:20:00
【问题描述】:

我喜欢将 json 字符串值转换为枚举,以便它可以在 html 页面上显示/呈现自定义字符串。 错误信息:输入'{ id: number;名称:字符串;状态:字符串; }[]' 不能分配给类型 'Status[]'

我有一个这样的 json 记录:

{ id: 1, name: 'Some name', status: 'STATUS01' },

status.enum.ts

export enum Status {
  'STATUS01' = 'Operational',
  'STATUS02' = 'Some other status'
}

该枚举在模型中使用

import { Status } from './status.enum';

export class ServiceState {
  id: number;
  name: string;
  status: Status;
}

在服务中有一个检索所有状态(虚拟数据)的功能:

getStatuses(): Observable<ServiceState[]> {
    const response = [
      { id: 1, name: 'One', status: 'STATUS01' },
      { id: 2, name: 'Two', status: 'STATUS01' },
      { id: 3, name: 'OneTwo', status: 'STATUS02' },}
    ];
    return of(response);
  }

返回是抛出错误

【问题讨论】:

  • 请添加引发错误的代码。

标签: json angular typescript serialization enums


【解决方案1】:

你应该实际使用枚举值:

export enum Status {
  STATUS01 = 'Operational',
  STATUS02 = 'Some other status'
}

const response = [
  { id: 1, name: 'One', status: Status.STATUS01 },
  { id: 2, name: 'Two', status: Status.STATUS01 },
  { id: 3, name: 'OneTwo', status: Status.STATUS02 },
  // ...
];

如果你想映射枚举中的值:

getStatuses(): Observable<ServiceState[]> {
  const response = [
    { id: 1, name: 'One', status: 'STATUS01' },
    { id: 2, name: 'Two', status: 'STATUS01' },
    { id: 3, name: 'OneTwo', status: 'STATUS02' },
  ];

  return of(response).pipe(
    map((states) => states.map((state) => ({
      ...state,
      status: Status[state.status]
    } as ServiceState)
  );
}

【讨论】:

  • webapi 将返回一个 STATUS01(字符串)而不是 Status.STATUS01。这是一些虚拟数据。
  • @Babulaas 那么你的输入不正确,或者你必须在响应中映射值
  • 我必须映射这些值。我度过了漫长的一天。谢谢你的修复。
  • @Babulaas 但是荷兰现在还不到下午 4 点:D,你应该尽量少工作,否则你的工作效率会下降太多!
【解决方案2】:

我仍然不明白您的问题,但您可能必须映射来自 API 的响应以匹配您的类类型。

服务

public getStatuses(): Observable<ServiceState[]> {
  return this.http.get('url').pipe(
    map(data => data.forEach(item => {
      item.status = Status[item.status];
    }))
  );
}

如果你只使用类来断言类型,那么一个简单的接口就足够了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    相关资源
    最近更新 更多