2013-02-15 50 views
22

Đây là mã Java của tôi được sử dụng để hủy tuần tự hóa, tôi đang cố chuyển đổi chuỗi json thành đối tượng java. Bằng cách đó tôi đã sử dụng đoạn mã sau:jackson deserialization json đối với các đối tượng 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); 
    } 
} 
} 

và lớp product.java tôi

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+"]"; 
} 
} 

tôi đang nhận được lỗi sau.

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) 

giúp đỡ tôi để giải quyết việc này,

Trả lời

29

Dường như bạn đang cố gắng đọc một đối tượng từ JSON thực sự mô tả một mảng. Các đối tượng Java được ánh xạ tới các đối tượng JSON có các dấu ngoặc nhọn {} nhưng JSON của bạn thực sự bắt đầu bằng các dấu ngoặc vuông [] chỉ định một mảng.

Những gì bạn thực sự có là List<product> Để mô tả các loại chung, do loại tẩy xóa của Java, bạn phải sử dụng TypeReference. Việc deserialization của bạn có thể đọc: myProduct = objectMapper.readValue(productJson, new TypeReference<List<product>>() {});

Một vài ghi chú khác: lớp học của bạn phải luôn là CamelCased. Phương pháp chính của bạn chỉ có thể là public static void main(String[] args) throws Exception giúp bạn tiết kiệm tất cả các khối catch vô ích.

2

lớp product của bạn cần một constructor parameterless. Bạn có thể đặt nó ở chế độ riêng tư, nhưng Jackson cần hàm tạo.

Lưu ý: Bạn nên sử dụng vỏ Pascal cho tên lớp của bạn. Đó là Product và không phải là product.

+0

@ Esteban Araya tôi đã thử lỗi này nhưng chưa xảy ra – MAHI

11

Bạn phải thay đổi dòng

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

để

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

vì bạn đang deserializing một mảng (btw: bạn nên bắt đầu tên lớp của bạn với chữ hoa chữ như đã đề cập trước đó). Ngoài ra, bạn phải tạo các phương thức setter cho các trường của bạn hoặc đánh dấu chúng là công khai để thực hiện công việc này.

Chỉnh sửa: Bạn cũng có thể đi với đề nghị Steven Schlansker và sử dụng

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

thay vì nếu bạn muốn tránh mảng.

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

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

điều này cũng thực hiện thủ thuật.

Các vấn đề liên quan