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对象之前转换为地图。

我希望在对象中定义latitude和设置器,而不是像我目前被迫(在 内)那样。longitudeLocationData

问题是,杰克逊不明白那source[longitude]实际上是source.longitude.

有什么办法解决吗?

4

1 回答 1

0

您需要进行自定义处理;要么通过编写 custom JsonDeserializer。您的用例相当深奥,因此没有开箱即用的支持。这有点像在 JSON 中拥有自己的数据格式,因此您需要自己的处理程序。

于 2012-09-10T17:31:41.380 回答