2

1. バックエンド

私のバックエンド(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.フロントエンド

フロントエンド (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. 結果

コードを実行した後:

MY_ENUMS contains ["A", "B"]

しかし、私は期待します:

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

1 に答える 1

3

デフォルト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}
    
于 2017-01-10T18:56:15.567 に答える