2013-02-15 41 views
22

这里是我的Java代码是用于反序列化, 我想将json字符串转换为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: [email protected]; line: 1, column: 8] (through reference chain: ex1jackson.product["id"]) 
BUILD SUCCESSFUL (total time: 0 seconds) 

帮我解决这个问题,

回答

29

它看起来像你试图从实际上描述一个数组的JSON中读取一个对象。 Java对象被映射到带花括号的JSON对象{},但是您的JSON实际上以方括号[]开头,指定一个数组。

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

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

2

product类需要一个参数的构造函数。你可以把它变成私人的,但杰克逊需要这个构造函数。

作为一个方面说明:你应该使用Pascal封套来处理你的类名。那是Product,而不是product

+0

@ Esteban Araya我已经尝试过,但同样的错误发生 – MAHI 2013-02-15 08:01:32

11

你要行

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

改变

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

因为你是反序列化阵列(顺便说一句:正如前面提到的,你应该用大写字母开头的类名)。此外,您必须为您的字段创建setter方法或将其标记为公开才能完成此工作。

编辑:您还可以去与史蒂芬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()); 

这也做了伎俩。