29

这是我用于反序列化的 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)

帮我解决这个问题,

4

4 回答 4

39

看起来您正试图从 JSON 中读取一个实际描述数组的对象。Java 对象映射到带有花括号的 JSON 对象,{}但您的 JSON 实际上以方括号开头,[]表示数组。

您实际拥有的是 aList<product>来描述泛型类型,由于 Java 的类型擦除,您必须使用TypeReference. 您的反序列化可以阅读:myProduct = objectMapper.readValue(productJson, new TypeReference<List<product>>() {});

其他一些注意事项:您的类应该始终是 PascalCased。您的主要方法可以为public static void main(String[] args) throws Exception您节省所有无用的catch块。

于 2013-02-15T08:33:23.643 回答
17

你必须换行

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

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

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

编辑:您也可以接受 Steven Schlansker 的建议并使用

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

相反,如果您想避免使用数组。

于 2013-02-15T09:07:22.420 回答
6
 JsonNode node = mapper.readValue("[{\"id\":\"value11\",\"name\": \"value12\",\"qty\":\"value13\"},"

 System.out.println("id : "+node.findValues("id").get(0).asText());

这也成功了。

于 2013-02-15T09:45:10.147 回答
2

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

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

于 2013-02-15T07:41:36.110 回答