以下代码可能看起来很复杂但实际上很简单(并且是复制/粘贴兼容的):
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
对象中定义longitude
和Location
setter,而不是我当前被迫(Data
内)。
问题是,杰克逊不明白source[longitude]
实际上是source.longitude
。
有什么方法可以解决它吗?
答案 0 :(得分:0)
您需要进行自定义处理;通过编写自定义JsonDeserializer
。您的用例相当深奥,因此没有开箱即用的支持。
这有点像让你自己的数据格式存在于JSON中,所以你需要自己的处理程序。