Javaで列挙型の各値のキーと値のマップ

beegotsy:

仕事

Javaのバックエンドのプロジェクトで、私はいくつかの(100+)外部列挙型を持って、私は編集することはできませんし、私たちのフロントエンドに出力する必要があること。私は方法のようなJSONオブジェクト内の出力それらに望んでいました。各列挙型は、異なる特性の名前を持っています。

以下の列挙型用など

public enum Colors {
  RED(1, "RED", "ff0000", Boolean.TRUE),
  GREEN(2, "GREEN", "00ff00", Boolean.FALSE),
  BLUE(3, "BLUE", "0000ff", Boolean.TRUE);

  private int code;
  private String label;
  private String hexCode;
  private boolean isAwesome;

  // ... getters and other methods
}

私は、出力したいです

[
  {
    label: "RED"
    hexCode: "ff0000"
    isAwesome: true
  },
  {
    label: "GREEN"
    hexCode: "00ff00"
    isAwesome: false
  },
  ...
]

私の試み

私は、Javaに新しいです、これは私がリフレクションを使用して、私は本当にこのに入る前には何も勉強しなかったの初めてです。おそらくそこに(パフォーマンスや、私が知らないことを他のいくつかの奇妙なもののように)このコードのいくつかの主要な問題がありますが、それはコンパイルし、仕事をしていません。これは安全である場合は、これを行うには、いくつかのより良い方法がある場合は、私が尋ねるので、私は、知りません。

private <T> List<HashMap<String, Object>> enumInserter(Class<T> clazz, List<String> properties) {
    return valuesToMap(clazz.getEnumConstants(), parserFactory(clazz, properties));
}

/**
* 
* @param <T>    type of the enum class
* @param values enumConstants of the enum
* @param parser a function that take a single enumValue of type <T> and returns
*               an property-value map
* @return the array of the property-value maps of each value
*/
private <T> List<HashMap<String, Object>> valuesToMap(T[] values, Function<T, HashMap<String, Object>> parser) {
  List<HashMap<String, Object>> enumValues = new ArrayList<>();
  for (T enumValue : values) {
    HashMap<String, Object> processedValue = parser.apply(enumValue);
    enumValues.add(processedValue);
  }
  return enumValues;
}

/**
* 
* @param <T>        the type of the enum class
* @param clazz      the enum class
* @param properties the properties to be added in the map
* @return a parser function that take a single enumValue of type <T> as input and
*         returns a property-value map of the given enumValue
*/
private <T> Function<T, HashMap<String, Object>> parserFactory(Class<T> clazz, List<String> properties) {
  return ((T enumValue) -> {
    HashMap<String, Object> map = new HashMap<>();

    properties.stream().forEach(propertyName -> {
      String methodName = getterFromProperty(propertyName);
      try {
        Method method = clazz.getMethod(methodName);
        Object methodResult = method.invoke(enumValue);
        map.put(propertyName, methodResult);
      } catch (Exception e) {
        // ... error logging
      }
    });

    return map;
  });
}

/**
* Return the "standard" property getter of a property. e.g. "example" will
* return "getExample"
* 
* @param property
* @return property getter method name
*/
private String getterFromProperty(String property) {
  return "get" + property.substring(0, 1).toUpperCase() + property.substring(1);
}
Alexandarペトロフ:

これまでの通常のアプローチは、アノテーションを使用してのいずれかである@JsonFormat(shape = JsonFormat.Shape.OBJECT)か、カスタム仕立てシリアライザの使用による。

あなたはクラスAから列挙型を参照していることを言うことができます

class A {

   @JsonFormat(shape = JsonFormat.Shape.OBJECT)
   private Colors color;

}

この色は、あなたが望むようにシリアル化するようになります。

あなたの列挙のためのカスタム・シリアライザを登録するでしょう代替aproachは、この次の方法で行うことができます。

public class ColorSerializer extends StdSerializer {

    public ColorSerializer() {
        super(Color.class);
    }

    public ColorSerializer(Class t) {
        super(t);
    }

    public void serialize(Color color, JsonGenerator generator,
      SerializerProvider provider) 
      throws IOException, JsonProcessingException {
        generator.writeStartObject();
        generator.writeFieldName("code");
        generator.writeString(color.getCode());
        generator.writeFieldName("hexCode");
        generator.writeString(color.getHexcode());
        generator.writeFieldName("isAwsome");
        generator.writeNumber(color.isAwsome());
        generator.writeEndObject();
    }
}

あなたの列挙型が外部にあるので、あなたは常にあなたのプロジェクトの内部にあり、この方法は、自分のシリアル化プロセスを制御するラッパーに置くことができます。

あなたが同じ戦略を使用してそれらをシリアル化したい場合は、シリアライザであなたの反射コードを配置することができます。この方法は、あなたではなく、各列挙のために書くので、単一の汎用シリアライザを取得します。

これは、カスタム・シリアライザを登録することができる方法です。

ObjectMapper mapper = new ObjectMapper();

SimpleModule module = new SimpleModule();
module.addSerializer(Color.class, new ColorSerializer ());
mapper.registerModule(module);

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=192329&siteId=1