杰克逊 - 如何将复杂的JSON转换为地图中的对象?

时间:2012-09-09 01:37:37

标签: java json jackson

以下代码可能看起来很复杂但实际上很简单(并且是复制/粘贴兼容的):

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。

我想在latitude对象中定义longitudeLocation setter,而不是我当前被迫(Data内)。

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

有什么方法可以解决它吗?

1 个答案:

答案 0 :(得分:0)

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