Java+Jackson で json 文字列から object を生成する際、特定プロパティを文字列のままとしたい

投稿者: Anonymous

Java+Jackson で json 文字列から object を生成する際、特定プロパティを
文字列のままとしたいのですが、そのようなことは可能でしょうか。

例えば

String text =
  "{" +
  "  "key1": "var1", " +
  "  "key2": {"subkey1":"subvar1", "subkey2":"subvar2"} " +
  "}";
ObjectMapper mapper = new ObjectMapper();
Map<String, Object> json = (Map<String, Object>) mapper.readValue(text, Map.class);

としたとき、

json.get("key1") → var1 という String を取得
json.get("key2") → {"subkey1":"subvar1", "subkey2":"subvar2"} という String を取得

としたいのです。

https://github.com/FasterXML/jackson-annotations/wiki/Jackson-Annotations
Jackson Annotations
から、これだ!というのは見つけられていないのですが、おそらく何かしらありそうな気がします。

もしない場合、一度オブジェクトに変換した key2 の値を、再度 json 文字列に
変換する予定ですが、おそらくパフォーマンス的に厳しいことになりそうなので、
Jackson で例外扱いできないかと思っております。

よろしくお願いいたします。

解決

@JsonSetterを使うと、うまくいくと思います。おそらくこのような感じで

import java.io.IOException;

import com.fasterxml.jackson.annotation.JsonSetter;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

public class Sample {
    public String key1;
    public String key2;

    public static void main(String[] args) throws IOException {
        String jsonStr = "{" + "  "key1": "var1", "
                + "  "key2": {"subkey1":"subvar1", "subkey2":"subvar2"} " + "}";
        ObjectMapper objectMapper = new ObjectMapper();
        Sample json = objectMapper.readValue(jsonStr, Sample.class);
        System.out.println(json.key2);
    }

    @JsonSetter("key2")
    void setKey2(JsonNode key2) {
        this.key2 = key2.toString();
    }
}

この実行結果は以下のようになります。

{"subkey1":"subvar1","subkey2":"subvar2"}
回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *