将Jackson反序列化JSON转换为Java对象

30

这是我的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个回答

40

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

你实际上拥有一个List<product>。为了描述泛型类型,在Java的类型擦除机制下,你必须使用TypeReference。你的反序列化可以这样写:myProduct = objectMapper.readValue(productJson, new TypeReference<List<product>>() {});

还有几个注意点:你的类名应该始终采用PascalCase风格。你的主方法只需写成public static void main(String[] args) throws Exception,这样就不需要所有无用的catch块了。


18

你需要改变这行代码

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>>() {});

如果你想避免使用数组,可以考虑使用其他方法。


6
 JsonNode node = mapper.readValue("[{\"id\":\"value11\",\"name\": \"value12\",\"qty\":\"value13\"},"

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

这也解决了问题。

2

你的product类需要一个无参构造函数。你可以将其设置为私有,但是Jackson需要这个构造函数。

顺便提一下:你应该使用帕斯卡命名法来命名你的类。也就是说,应该使用Product而不是product


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接