Java Jackson 映射到 POJO 无法反序列化实例实例
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/19447995/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Hymanson mapping to POJO cannot deserialize instance instance
提问by topspeed
I am receiving data in a Hymanson format and want to read it into a POJO I have defined. I am either badly defining the POJO or missing some key step. The data format being received is in the format below:
我正在接收 Hymanson 格式的数据,并希望将其读入我定义的 POJO。我要么错误地定义了 POJO,要么遗漏了一些关键步骤。接收到的数据格式如下:
{
streetSegment: [
{
distance: "0.04",
highway: "residential",
name: "Swift",
line: "-1.6720224 52.6251985,-1.6721061 52.6250432,-1.6721799, 52.6248908,-1.6721996 52.6247594",
wayId: "76473524"
},
{
distance: "0.05",
highway: "residential",
name: "Swift",
line: "-1.6721799 52.6248908,-1.6723374 52.6248669,-1.6732035 52.6249774,-1.6734643 52.6249894",
wayId: "76473523"
}
]
}
I have defined the POJO as:
我将 POJO 定义为:
public class StreetSegment {
public static class Street {
private String distance;
private String highway;
private String name;
private String line;
private String wayId;
public Street() {
super();
}
public String getDistance() {
return distance;
}
public void setDistance(String distance) {
this.distance = distance;
}
public String getHighway() {
return highway;
}
public void setHighway(String highway) {
this.highway = highway;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLine() {
return line;
}
public void setLine(String line) {
this.line = line;
}
public String getWayId() {
return wayId;
}
public void setWayId(String wayId) {
this.wayId = wayId;
}
}
}
}
When I read the object mapper with the following line:
当我使用以下行读取对象映射器时:
List<StreetSegment> list = mObjectMapper.readValue( in, new TypeReference<List<StreetSegment>>(){} );
I get an exception as shown:
我得到一个异常,如图所示:
10-18 12:49:57.596: W/System.err(31776): com.fasterxml.Hymanson.databind.JsonMappingException: Can not deserialize instance of java.util.ArrayList out of START_OBJECT token
10-18 12:49:57.596: W/System.err(31776): at [Source: java.io.StringReader@42ea8038; line: 1, column: 1]
10-18 12:49:57.606: W/System.err(31776): at com.fasterxml.Hymanson.databind.DeserializationContext.mappingException(DeserializationContext.java:575)
10-18 12:49:57.616: W/System.err(31776): at com.fasterxml.Hymanson.databind.DeserializationContext.mappingException(DeserializationContext.java:569)
10-18 12:49:57.616: W/System.err(31776): at com.fasterxml.Hymanson.databind.deser.std.CollectionDeserializer.handleNonArray(CollectionDeserializer.java:259)
10-18 12:49:57.626: W/System.err(31776): at com.fasterxml.Hymanson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:217)
10-18 12:49:57.626: W/System.err(31776): at com.fasterxml.Hymanson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:207)
10-18 12:49:57.636: W/System.err(31776): at com.fasterxml.Hymanson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:23)
10-18 12:49:57.636: W/System.err(31776): at com.fasterxml.Hymanson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2888)
10-18 12:49:57.646: W/System.err(31776): at com.fasterxml.Hymanson.databind.ObjectMapper.readValue(ObjectMapper.java:2041)
10-18 12:49:57.646: W/System.err(31776): at co.uk.dominion.test.MainActivity._getStreetSegmentFromURL(MainActivity.java:3428)
10-18 12:49:57.646: W/System.err(31776): at co.uk.dominion.test.MainActivity.doInBackground(MainActivity.java:3460)
10-18 12:49:57.656: W/System.err(31776): at co.uk.dominion.test.MainActivity.doInBackground(MainActivity.java:1)
10-18 12:49:57.656: W/System.err(31776): at android.os.AsyncTask.call(AsyncTask.java:287)
10-18 12:49:57.656: W/System.err(31776): at java.util.concurrent.FutureTask.run(FutureTask.java:234)
10-18 12:49:57.656: W/System.err(31776): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
10-18 12:49:57.656: W/System.err(31776): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
10-18 12:49:57.656: W/System.err(31776): at java.lang.Thread.run(Thread.java:856)
I also tried defining as a JsonNode first to see if I could spot the issue but to no avail:
我还尝试首先定义为 JsonNode 以查看是否可以发现问题,但无济于事:
JsonNode node = mObjectReader.readValue(in);
List<StreetSegment> list = mObjectMapper.readValue(node.toString(), new TypeReference<List<StreetSegment>>(){});
采纳答案by Maxim Shoustin
Create Street
by this way:
Street
通过这种方式创建:
Street
街道
public class Street {
private List<StreetSegment> streetSegment;
public Street() {
// TODO Auto-generated constructor stub
}
public List<StreetSegment> getStreetSegment() {
return streetSegment;
}
public void setStreetSegment(List<StreetSegment> streetSegment) {
this.streetSegment = streetSegment;
}
}
StreetSegment
街段
public class StreetSegment {
private String distance;
private String highway;
private String name;
private String line;
private String wayId;
public StreetSegment() {
}
public String getDistance() {
return distance;
}
public void setDistance(String distance) {
this.distance = distance;
}
public String getHighway() {
return highway;
}
public void setHighway(String highway) {
this.highway = highway;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLine() {
return line;
}
public void setLine(String line) {
this.line = line;
}
public String getWayId() {
return wayId;
}
public void setWayId(String wayId) {
this.wayId = wayId;
}
}
To check it, here is main
:
要检查它,这里是main
:
public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException {
String str = "{" +
" \"streetSegment\": [" +
" {" +
" \"distance\": \"0.04\"," +
" \"highway\": \"residential\"," +
" \"name\": \"Swift\"," +
" \"line\": \"-1.6720224 52.6251985,-1.6721061 52.6250432,-1.6721799, 52.6248908,-1.6721996 52.6247594\"," +
" \"wayId\": \"76473524\"" +
" }," +
" {" +
" \"distance\": \"0.05\"," +
" \"highway\": \"residential\"," +
" \"name\": \"Swift\"," +
" \"line\": \"-1.6721799 52.6248908,-1.6723374 52.6248669,-1.6732035 52.6249774,-1.6734643 52.6249894\"," +
" \"wayId\": \"76473523\"" +
" }" +
" ]" +
"}";
// to simulate stream reader
InputStreamReader in = new InputStreamReader(new ByteArrayInputStream(str.getBytes()));
BufferedReader streamReader = new BufferedReader(in);
StringBuilder buff = new StringBuilder();
String inputStr;
while ((inputStr = streamReader.readLine()) != null)
buff.append(inputStr);
ObjectMapper mapper = new ObjectMapper();
Street mj = mapper.readValue(buff.toString(), Street.class);
if(mj == null){
System.err.println("null");
}
}
Checking...
检查...
System.out.println(mj.getStreetSegment().get(0).getHighway());//dummy print
Output: residential
输出: residential
回答by darshandzend
Redefine your models in two seperate classes, viz StreetSegment
and Street
.
重新定义你的模型在两个不同的类别,即StreetSegment
和Street
。
public class StreetSegment {
list<Street> street_list;
//getters and setters
}
and
和
public class Street {
private String distance;
private String highway;
private String name;
private String line;
private String wayId;
//getters and setters
}
//skip the rest if your problem is solved
//如果你的问题解决了,跳过其余部分
I'm guessing you're using @RequestBody
for getting JSON body of request.
I would use it this way:
我猜你是@RequestBody
用来获取请求的 JSON 正文的。我会这样使用它:
public your_return_type your_method(@RequestBody String rb) {
ObjectMapper om = new ObjectMapper();
StreetSegment ss = om.readValue(rb, StreetSegment.class);
//and the rest
.
.
.