jackson反序列化json到java-objects

这是我的Java代码,用于反序列化,我试图将json字符串转换为java对象。 这样做我使用了以下代码:

package ex1jackson; import com.fasterxml.jackson.core.JsonGenerationException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; public class Ex1jackson { public static void main(String[] args) { ObjectMapper mapper = new ObjectMapper(); try { String userDataJSON = "[{\"id\":\"value11\",\"name\": \"value12\",\"qty\":\"value13\"}," + "{\"id\": \"value21\",\"name\":\"value22\",\"qty\": \"value23\"}]"; product userFromJSON = mapper.readValue(userDataJSON, product.class); System.out.println(userFromJSON); } catch (JsonGenerationException e) { System.out.println(e); } catch (JsonMappingException e) { System.out.println(e); } catch (IOException e) { System.out.println(e); } } } 

和我的product.java类

 package ex1jackson; public class product { private String id; private String name; private String qty; @Override public String toString() { return "Product [id=" + id+ ", name= " + name+",qty="+qty+"]"; } } 

我收到以下错误。

 com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "id" (class ex1jackson.product), not marked as ignorable (0 known properties: ]) at [Source: java.io.StringReader@16f76a8; line: 1, column: 8] (through reference chain: ex1jackson.product["id"]) BUILD SUCCESSFUL (total time: 0 seconds) 

帮我解决这个问题,

看起来您正在尝试从JSON中读取实际描述数组的对象。 Java对象使用大括号{}映射到JSON对象,但您的JSON实际上以方括号[]指定数组开头。

你实际拥有的是List要描述generics类型,由于Java的类型擦除,你必须使用TypeReference 。 您的反序列化可以是: myProduct = objectMapper.readValue(productJson, new TypeReference>() {});

其他一些注意事项:您的课程应该始终是CamelCased。 你的main方法可以只是public static void main(String[] args) throws Exception ,它会为你节省所有无用的catch块。

你必须改变这条线

 product userFromJSON = mapper.readValue(userDataJSON, product.class); 

 product[] userFromJSON = mapper.readValue(userDataJSON, product[].class); 

因为你反序列化一个数组(顺便说一句:你应该用大写字母开始你的类名,如前所述)。 此外,您必须为您的字段创建setter方法或将它们标记为公共,以使其工作。

编辑:您也可以使用Steven Schlansker的建议和使用

 List userFromJSON = mapper.readValue(userDataJSON, new TypeReference>() {}); 

相反,如果你想避免数组。

  JsonNode node = mapper.readValue("[{\"id\":\"value11\",\"name\": \"value12\",\"qty\":\"value13\"}," System.out.println("id : "+node.findValues("id").get(0).asText()); 

这也成功了。

您的product类需要无参数构造函数。 你可以将其设为私有,但jackson需要构造函数。

作为旁注:您应该使用Pascal大小写作为您的类名。 那是Product ,而不是product