2011-07-31 28 views
10

Tôi đã một lớp trông như thế này:

public class Person { 
    public class Address { 
     private String line1; 
     private String line2; 
     private String zipCode; 
     private String state; 

     // standard public getters and setters for the class here 
    } 

private String name; 
private String address; 

// standard public getters and setters for the class here 

} 

và dưới đây là cách Tôi đang sử dụng jackson với nó.

public class JsonTest { 
    public static <T> Object fromJson(String jsonAsString, Class<T> pojoClass) 
throws JsonMappingException, JsonParseException, IOException { 
     return m.readValue(jsonAsString, pojoClass); 
    } 

    public static String toJson(Object pojo, boolean prettyPrint) 
throws JsonMappingException, JsonGenerationException, IOException { 
     StringWriter sw = new StringWriter(); 
     JsonGenerator jg = jf.createJsonGenerator(sw); 
     if (prettyPrint) { 
      jg.useDefaultPrettyPrinter(); 
     } 
     m.writeValue(jg, pojo); 
     return sw.toString(); 
    } 

    public static void main(String[] args) { 
     Person p = new Person(); 
     String json = this.toJson(p, true); // converts ‘p’ to JSON just fine 
     Person personFromJson = this.fromJson(json, Person.class); // throws exception!!! 
    } 
} 

dòng thứ 3 của phương thức main (nơi tôi cố gắng để chuyển đổi json để đối tượng Person), ném ngoại lệ này:

IOException: Can not deserialize Class com.mycompany.models.Person$Address (of type non-static member class) as a Bean 

những gì tôi làm sai?

+2

Có vẻ như bạn không thể tuần tự hóa các lớp như vậy, hãy xem http://www.cowtowncoder.com/blog/archives/2010/08/entry_411.html để biết chi tiết –

+0

@Stas Kurilin - Bạn nên biến nhận xét đó thành câu trả lời, cái đúng của nó. – Perception

+0

@Perception, done. Nhưng tôi hy vọng smb có thể giúp ishaq theo cách tốt hơn. –

Trả lời

8

Bởi vì lớp bên trong không có hàm tạo đối số 0 mặc định (chúng có tham chiếu ẩn đối với lớp bên ngoài/cấp độ gốc), Jackson không thể khởi tạo chúng.

Các giải pháp là sử dụng static lớp bên trong:

public class Outer { 
    static class Inner { 
     private String foo; 
     public String getFoo() { return foo; } 
    } 
} 

gốc trả lời:

Có một số vấn đề trong việc thực hiện và nó có vẻ như bạn không thể serialize các lớp học như vậy, xem cowtowncoder cho chi tiết.

+0

bạn thưa ngài! là một quý ông –

3

Chính xác, đây từng là thứ bạn không thể làm với phiên bản Jackson hiện tại (1.8 trở lên). Nhưng nó là hoàn toàn cần thiết cho lớp bên trong được không tĩnh? Nếu không, chỉ cần thêm 'tĩnh' trong khai báo Địa chỉ và nó sẽ hoạt động tốt; vấn đề là với "ẩn" con trỏ này mà các lớp bên trong không tĩnh đi qua constructor.

Jackson 1.9 sẽ thực sự hỗ trợ deserialization sử dụng đơn giản của các lớp bên trong không tĩnh, xem này Jira entry.

+0

có, đó là chính xác những gì tôi đã làm, đã thêm ‘tĩnh’ vào khai báo lớp bên trong. không biết các lớp bên trong tĩnh và tĩnh khác nhau như thế nào, bây giờ tôi biết. cảm ơn. –

+0

Ok, vui vì điều đó thật dễ dàng! :) – StaxMan

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