0

次のようなクラス Diff があります。

public class Diff {

    private String path;
    private String value;
    private Operation operation;

    public enum Operation {
        ADD, REPLACE, REMOVE
    }

    // getters and setters
}

次の呼び出しを使用して json ノードを作成します。

ObjectMapper mapper = new ObjectMapper();
mapper.valueToTree(diffObject);

次のような Diff がある場合:

Diff diff = new Diff();
diff.setPath("/path");
diff.setValue("value");
diff.setOperation(Operation.REPLACE);

やっている:

mapper.valueToTree(diff);

戻ります:

"{"path":"/path", "value":"value","operation":"REPLACE"}"

ただし、「操作」という言葉は「操作」である必要があります。おそらく、「操作」を読み取るときに「操作」に変換するように ObjectMapper を構成する方法があると思われますが、その方法がわかりません。誰か知ってる?

4

1 に答える 1

0

@JsonProperty アノテーションを使用できます

public static class Diff {

    private String path;
    private String value;

    @JsonProperty("op")
    private Operation operation;
}

[更新]
クラスにアクセスできないため、ByteBuddy を使用してクラスを少し変更できますか? :)

例えば:

@Test
public void byteBuddyManipulation() throws JsonProcessingException, IllegalAccessException, InstantiationException {
    ObjectMapper objectMapper = new ObjectMapper();

    AnnotationDescription annotationDescription = AnnotationDescription.Builder.forType(JsonProperty.class)
            .define("value", "op")
            .make();

    Class<? extends Diff> clazz = new ByteBuddy()
            .subclass(Diff.class)
            .defineField("operation", Diff.Operation.class)
            .annotateField(annotationDescription)
            .make()
            .load(Diff.class.getClassLoader(), ClassLoadingStrategy.Default.INJECTION)
            .getLoaded();

    Diff diffUpdated = clazz.newInstance();
    diffUpdated.setOperation(Diff.Operation.ADD);

    objectMapper.valueToTree(diffUpdated);   //returns "op":"ADD"
}


[UPDATE 2]
または、単純に Diff のサブクラスを作成し、操作フィールドをシャドウします

public static class YourDiff extends Diff {
    @JsonProperty("op")
    private Operation operation;

    @Override public Operation getOperation() {
        return operation;
    }

    @Override public void setOperation(Operation operation) {
        this.operation = operation;
    }
}
于 2016-04-14T19:06:29.950 に答える