2016-10-11 11 views
6

Đây là dữ liệu Firebase chính đơn giản của tôi.Làm thế nào để deserialize cơ sở dữ liệu Firebase lồng nhau trong Java với Map <String, Obect> hoặc List <object> lớp?

{ 
    "elephant" : { 
    "color" : "gray", 
    "lifespan" : 48, 
    "status" : "endangered" 
    } 
} 

Trong dự án Android của tôi, tôi làm lớp này để đại diện cho dữ liệu này

public class elephant{ 
    private String color; 
    private int lifespan; 
    private String status; 

    // Constructors 
    public elephant(){ 
    } 

    public elephant(String color, int lifespan, String status) { . . . } 

    // Getters and Setters 
    public String getColor() { return color; } 

    public void setColor(String color) { this.color = color; } 

    public int getLifespan() { return lifespan; } 

    public void setLifespan(int lifespan) { this.lifespan = lifespan; } 

    public String getStatus() { return status; } 

    public void setStatus(String status) { this.status = status; } 
} 

Bằng cách đó tôi có thể gọi phương thức getValue (elephant.class) để lấy dữ liệu này.

Elephant ele = datasnapshot.getValue(elephant.class); 

Nó hoạt động.

Bây giờ tôi đang thêm một nút lồng nhau vào dự án của mình.

{ 
    "elephant" : { 
    "color" : "gray", 
    "lifespan" : 48, 
    "status" : "endangered", 
    "dimension" : { 
     "height" : 270, 
     "length" : 607 
    } 
    } 
} 

database Image

tôi đã tạo ra một lớp mới gọi là Dimension.java trong dự án của tôi:

public class Dimension { 
    private int length, height; 

    // Constructors 
    public Dimension() { } 

    public Dimension(int length, int height) { . . . } 

    // Public getters and setters 
    public int getLength() {return length;} 

    public void setLength(int length) {this.length = length;} 

    public int getHeight() {return height;} 

    public void setHeight(int height) {this.height = height;} 
} 

Và tôi sửa đổi elephant.java tôi để bao gồm biến này/đối tượng:

private Dimension dimension; 

và công cụ xây dựng thích hợp, getters và setters cho nó.

và phương pháp trước đó của tôi vẫn hoạt động. Nó trả về biểu diễn java thích hợp cho toàn bộ bản dữ liệu.

Elephant ele = datasnapshot.getValue(elephant.class); 

và, Nếu tôi nhận được một datasnapshot tại DatabaseRef.child ('chiều') Tôi có thể vượt qua dimension.class đến phương thức getValue() để lấy dữ liệu thích hợp:

Dimension data = datasnapshot.getValue(dimension.class); 

Như vậy những đa các lớp học khá thuận tiện với tôi.

Bây giờ, tôi biết, dữ liệu Firebase được cho là được chuẩn hóa/làm phẳng. Nhưng đối với các thí nghiệm, hãy nói rằng tôi đã thêm một số dữ liệu với pushID.

{ 
    "elephant" : { 
    "color" : "gray", 
    "status" : "endangered", 
    "lifespan" : 48, 
    "dimension" : { 
     "height" : 270, 
     "length" : 607 
    }, 
    "population" : { 
     "-KTcpw_SsMb55qLc6Xme" : { 
     "count" : 210, 
     "location" : "Bangladesh" 
     }, 
     "-KTcq6YeB3kX3h9F9xPU" : { 
     "count" : 428, 
     "location" : "Bhutan" 
     }, 
     "-KTcqDySLBAFtCuUc3R4" : {...}, 
     "-KTcqMyy4GULKo6FqPEM" : {...}, 
     "-KTcqWwtli672ROpry8_" : {...}, 
     "-KTcqhnBb6dTN1mA1otW" : {...} 
    } 
    } 
} 

Database Screenshot

Bây giờ, nếu tôi muốn làm công việc mã trước cho trường hợp này:

Elephant ele = datasnapshot.getValue(elephant.class); 

Làm thế nào để viết lớp mới của tôi cho nút 'dân số'.

Trong tài liệu tham khảo Firebase, nó được cho là nó trả về số tương đương là Map<String, Object> hoặc List<Object> java. Nhưng là một người mới bắt đầu trong Java tôi đang mắc kẹt với vấn đề này trong 4 ngày qua.

Tôi có thể lặp qua số dataSnapshot.child('population') và thêm chúng vào Danh sách đối tượng 'population' riêng biệt. Nhưng tôi đã tự hỏi liệu nó có thể đạt được theo cách này hay không. Xin vui lòng giúp tôi với mã hoặc liên kết tôi đến một ví dụ nơi nó đã được thực hiện trong một dòng và tự động. Nó sẽ là một cứu trợ.

Trả lời

4

Bạn có thể thử cái này:

class PopulationDetail { 
    long count; 
    String location; 
} 

class Elephan { 
    ... 
    Map<String, PopulationDetail> population; 
    ... 
} 
+0

Nó làm việc. :) Tôi đã xuống đường này một lần nhưng một nơi nào đó trong mã tôi đã hơi say và nó đã không hoạt động. – BorhnN

+0

Cảm ơn bạn rất nhiều :) – BorhnN

1

Để chuyển đổi json vào lớp POJO, hãy thử này -

http://www.jsonschema2pojo.org/

+0

Cảm ơn bạn đã trả lời. Tôi không biết điều này tồn tại. Tôi đã dán tệp JSON của mình ở đó và chọn JSON ở loại nguồn. Vấn đề là, cùng với các kiểu thông thường nó tạo ra một lớp '-KTcpw_SsMb55qLc6Xme' và một lớp' -KTcq6YeB3kX3h9F9xPU'. Và đó là điều tôi không muốn. Vì vậy, bây giờ tôi đang học cách viết JSON Schema. Vì Firebase không hỗ trợ mảng gốc nên tôi nên viết đối tượng này như thế nào để đạt được loại 'Map ' hoặc 'List '? – BorhnN

+1

Trong trường hợp này bạn có thể làm như Huy Lưu trả lời. –

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