以下代码可能看起来很复杂,但实际上很简单(并且与复制/粘贴兼容):
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
和设置器,而不是像我目前被迫(在 内)那样。longitude
Location
Data
问题是,杰克逊不明白那source[longitude]
实际上是source.longitude
.
有什么办法解决吗?