0

次のコードは複雑に見えるかもしれませんが、実際には単純です (コピー/貼り付けの互換性があります)。

import java.io.IOException;
import java.util.Map;

import org.junit.Test;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonTest {
    @Test
    public void test_complex_json_to_object() throws JsonGenerationException, JsonMappingException, IOException {
        final String json = "{\"source[longitude]\":[\"26.3843435\"],\"source[latitude]\":[\"174.78830093\"]}";

        final ObjectMapper m = new ObjectMapper();

        @SuppressWarnings("unchecked")
        final Map<String, Object> json_map = m.readValue(json, Map.class);

        m.convertValue(json_map, Data.class);
    }

    public static class Location {
        public double   latitude;
        public double   longitude;
    }

    public static class Data {
        public Location location;

        @JsonProperty(value = "source[longitude]")
        public void setSource__longitude(final String[] data) { // Invoked.
            System.err.println("longitude");
        }

        @JsonProperty(value = "source[latitude]")
        public void setSource__latitude(final String[] data) { // Invoked.
            System.err.println("latitude");
        }

        public void setLocation(final String[] data) { // NOT Invoked!
            System.err.println("latitude");
        }
    }
}

JSON 文字列は固定です。外部サービスからマップとして取得するため、Dataオブジェクトに変換する前に Map に変換します。

latitudelongitudeセッターをオブジェクト内で定義したいと思いLocationますが、現在 (内で) 強制されているわけではありませんData

問題は、ジャクソンがそれが実際にであることを理解していないことです。source[longitude]source.longitude

それを解決する方法はありますか?

4

1 に答える 1

0

カスタム処理を行う必要があります。どちらかでカスタムしてJsonDeserializerください。あなたのユースケースはかなり難解なので、すぐに使えるサポートはありません。これは、JSON 内に独自のデータ形式が存在するようなものであるため、独自のハンドラーが必要です。

于 2012-09-10T17:31:41.380 に答える