休息:发送枚举列表不会发送所有数据

时间:2017-01-10 18:43:35

标签: json spring-boot jackson jax-rs json-serialization

1。 BACKEND

在我的后端(SpringBoot)中,我发送了枚举列表:

@RequestMapping("getMyEnum")
public List<MyEnum> getMyEnum() {
    return Arrays.asList(MyEnum.values());
}

这是MyEnum:

public enum MyEnum {

  A("bla1"),
  B("bla2");  

  private String value;

  MyEnum(String value) {
...

2。 FRONTEND

在前端(angular2)我在ng2组件中收到此列表:

 MY_ENUMS: MyEnum[];
 ...
 this.http.get('/util/getClassifications')
  .map(response => response.json())
  .subscribe(myEnums => {
    this.MY_ENUMS = myEnums;
  });

这是MyEnum类:

export class MyEnum {
    value: string;
}

第3。 RESULT

运行代码后:

MY_ENUMS contains ["A", "B"]

但我希望:

MY_ENUMS will contains [ "A" : { "value" : "bla1"}, 
                         "B" : { "value" : "bla2"}]

1 个答案:

答案 0 :(得分:2)

默认情况下Jackson(Spring Boot中使用的JSON映射器)仅序列化枚举名称。要调整枚举序列化 - 并将其视为每个其他对象 - 在枚举中添加以下JsonFormat注释,它也将映射枚举的所有属性。

@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum MyEnum

更新

  1. 确保您的枚举提供所有吸气剂。

    @JsonFormat(shape = JsonFormat.Shape.OBJECT)
    public enum MyEnum {
    
       A("bla1", 1),
       B("bla2", 2);
    
       private String valueA;
       private long valueB;
    
       MyEnum(String valueA, long valueB) {
         this.valueA = valueA;
         this.valueB = valueB;
       }
    
       public String getValueA() {
         return valueA;
       }
    
       public long getValueB() {
         return valueB;
       }
    }    
    
  2. 您可以使用

    测试序列化
    ObjectMapper mapper = new ObjectMapper();
    System.out.println(mapper.writeValueAsString(MyEnum.A));
    
  3. 结果是

    {"valueA":"bla1","valueB":1}