2013-04-24 3 views
5

Đây là một ví dụ về các loại JSON Tôi đang cố gắng để tiêu thụ sử dụng GSON:Có thể deserialize tên thuộc tính JSON với các khoảng thời gian như một đối tượng lồng nhau bằng GSON không?

{ 
    "person": { 
     "name": "Philip" 
     "father.name": "Yancy" 
    } 
} 

Tôi đã tự hỏi nếu nó đã có thể deserialize JSON này vào cấu trúc sau:

public class Person 
{ 
    private String name; 
    private Father father; 
} 

public class Father 
{ 
    private String name; 
} 

Vì vậy, rằng:

p.name == "Philip" 
p.father.name == "Yancy" 

Hiện tại tôi đang sử dụng @SerializedName để lấy tên thuộc tính có chứa khoảng thời gian, ví dụ:

public class Person 
{ 
    private String name; 

    @SerializedName("father.name") 
    private String fathersName; 
} 

Tuy nhiên, điều đó không lý tưởng.

Từ khi xem tài liệu, nó dường như không thể ngay lập tức nhưng có thể có điều gì đó tôi đã bỏ lỡ - Tôi mới sử dụng GSON.

Rất tiếc, tôi không thể thay đổi JSON tôi đang sử dụng và tôi miễn cưỡng chuyển sang thư viện phân tích cú pháp JSON khác.

+0

Tôi không biết GSON đủ tốt, nhưng có lẽ nó có giao diện Parser riêng mà bạn có thể thực hiện, cho phép bạn truy cập vào khóa/giá trị json mà bạn có thể chọn làm bất cứ điều gì bạn muốn. tạo các đối tượng 'Person' và' Father'. –

Trả lời

4

Theo tôi hiểu, bạn không thể thực hiện theo cách trực tiếp, vì Gson sẽ hiểu được father.name là một trường duy nhất.

Bạn cần phải tự viết Custom Deserializer của riêng mình. Xem hướng dẫn sử dụng của Gson here.

Tôi chưa bao giờ thử, nhưng dường như không quá khó. Điều này post cũng có thể hữu ích.

Nhìn vào hướng dẫn sử dụng Gson và mã trong bài này, bạn sẽ cần một cái gì đó như thế này:

private class PersonDeserializer implements JsonDeserializer<Person> { 

    @Override 
    public Person deserialize(JsonElement json, Type type, 
     JsonDeserializationContext context) throws JsonParseException { 

    JsonObject jobject = (JsonObject) json; 

    Father father = new Father(jobject.get("father.name").getAsString()); 

    return new Person(jobject.get("name").getAsString(), father); 
    } 
} 

Giả sử bạn có nhà thầu phù hợp ...

Và sau đó:

GsonBuilder gsonBuilder = new GsonBuilder(); 
gsonBuilder.registerTypeAdapter(Person.class, new PersonDeserializer()); 
Gson gson = gsonBuilder.create(); 
Person person = gson.fromJson(jsonString, Person.class); 

Và Gson sẽ gọi trình khử giải trình tự của bạn để deserialize JSON thành đối tượng Person.

Lưu ý: Tôi đã không thử mã này, nhưng nó phải như thế này hoặc một cái gì đó rất giống nhau.

+0

Tôi nghĩ rằng đây là cách tiếp cận tôi sẽ thực hiện, cảm ơn bạn. – Jonathan