2013-01-10 44 views
14

Tôi có một đối tượng người dùng với cấu trúc này:deserializing một lĩnh vực bản đồ <String, Object> với Gson

class User { 
    private String id; 
    private String name; 
    private Map<String, Object> properties; 

    // GETTERS & SETTERS 
} 

Tôi có một JSON String với cấu trúc này: Phím

{ 
    "user": { 
     "id:"123456789", 
     "name:"azerty", 
     "emailHash":"123456789", // not used in User class 
     "properties": { 
      "p1":1, 
      "p2":"test", 
      "p3":[1, 2, 3, 4], 
      "p4":{ 
       etc... 
      } 
     } 
    } 
} 

Properties' là Chuỗi, giá trị của Thuộc tính có thể là Chuỗi, int, Mảng, boolean, Bản đồ, v.v.

Tôi cố gắng deserialize chuỗi JSON này với Gson như sau:

JsonParser parser = new JsonParser(); 
JsonElement element = parser.parse(jsonString); 
JsonObject object = element.getAsJsonObject(); 

GsonBuilder builder = new GsonBuilder(); 
builder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES); 
Gson gson = builder.create(); 
User user = (User) gson.fromJson(object.get("user"), new TypeToken<User>() {}.getType()); 

Trường 'id' và 'name' được chèn chính xác nhưng trường 'thuộc tính' không có giá trị.

Bạn có biết tôi đang làm gì sai không? Cảm ơn trước sự giúp đỡ của bạn!

+0

Tôi khuyên bạn nên có thuộc tính là 'JsonObject' và sau đó chuyển đổi JSON trực tiếp thành' Map '. – Srinivas

+0

Mã của bạn hoạt động hoàn toàn tốt với một vấn đề nhỏ: bạn dường như đã tạo ra một 'GsonBuilder' có tên' builder' nhưng sau đó sử dụng một tên 'gsonBuilder'. Nếu đó thực sự là biên dịch thì bạn có một 'GsonBuilder' khác mà bạn đã tạo trước đó và đang sử dụng nó do nhầm lẫn. Khác hơn thế ... nó deserializes tốt trên máy tính của tôi. –

+0

'gsonBuilder' là một lỗi khi tôi viết chủ đề. Đó là 'builder' mà tôi sử dụng trong mã của mình. Tôi sẽ chỉnh sửa chủ đề của mình để sửa chữa. Trường 'properties' được chèn đúng vào thử nghiệm của bạn? Nó rất lạ nó vẫn vô ích đối với tôi ... –

Trả lời

9

Đối với tôi mã này:

public class Main { 
    public static void main(String[] args) throws IOException { 
    GsonBuilder builder = new GsonBuilder(); 
    builder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES); 
    Gson gson = builder.create(); 
    FileInputStream inputStream = new FileInputStream(new File("bobi.json")); 
    InputStreamReader reader = new InputStreamReader(inputStream); 
    User user = gson.fromJson(reader, User.class); 
    System.out.println(user.getName()); 
    System.out.println(user.getId()); 
    for (String property : user.getProperties().keySet()) { 
     System.out.println("Key: " + property + " value: " + user.getProperties().get(property)); 
    } 
    reader.close(); 
} 

Prints này:

azerty 
123456789 
Key: p1 value: 1.0 
Key: p2 value: test 
Key: p3 value: [1.0, 2.0, 3.0, 4.0] 
Key: p4 value: {} 

Tuy nhiên, hãy nhớ rằng tôi đã bị tước đối tượng json gói trong file tôi phân tích. Các tập tin là:

{ 
     "id":"123456789", 
     "name" : "azerty", 
     "emailHash":"123456789", 
     "properties": { 
      "p1":1, 
      "p2":"test", 
      "p3":[1, 2, 3, 4], 
      "p4":{ 

      } 
     } 
} 

Ngoài ra tôi thêm đóng dấu nháy kép cho nameid, mà bạn không có trong mẫu của bạn.

Lớp User theo yêu cầu của OP. Tôi đã thêm getters và setters vì lý do in ấn:

import java.util.Map; 

class User { 
    private String id; 
    private String name; 
    private Map<String, Object> properties; 
    public String getId() { 
     return id; 
    } 
    public void setId(String id) { 
     this.id = id; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public Map<String, Object> getProperties() { 
     return properties; 
    } 
    public void setProperties(Map<String, Object> properties) { 
     this.properties = properties; 
    } 
} 
+0

Bạn có thể đăng đối tượng 'người dùng' mà bạn đã sử dụng không? Tôi thử mã của bạn nhưng 'thuộc tính' luôn luôn là' null' ... Tôi đang trên JDK7 và Gson 2.2.2 nếu tôi có thể giúp ... –

+0

@FranckYapadesouciAnso: Đã thêm. Gson 2.1, java 1.7 –

+0

Ok tôi đã tìm thấy sai lầm của mình. Đó là FieldNamingPolicy vấn đề. Cảm ơn bạn đã giúp đỡ. Chúc một ngày tốt lành! –

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