45302


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

例えば

[code]

    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);
    
[/code]

としたとき、

[code]

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

としたいのです。

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

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

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


CC BY-SA 4.0
2018-07-03T04:53:01.907
45256
2018-07-06T06:33:24.393
2018-07-04T04:37:37.823
25519
25519
question
java json jackson
Java+Jackson で json 文字列から object を生成する際、特定プロパティを文字列のままとしたい


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

[code]

    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();
        }
    }
    
[/code]

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

[code]

    {"subkey1":"subvar1","subkey2":"subvar2"}
    
[/code]


CC BY-SA 4.0
2018-07-04T06:29:29.800
45302
2018-07-04T06:29:29.800
21092
45256
answer