2013-01-10 108 views
14

我有一個用戶對象具有這種結構:反序列化地圖<字符串,對象>場與GSON

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

    // GETTERS & SETTERS 
} 

我有一個JSON字符串具有該結構:

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

屬性鍵是字符串,屬性的值可以是字符串,int,數組,布爾值,映射等。

我試圖用Gson反序列化這個JSON字符串:

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()); 

字段'id'和'name'被正確注入,但字段'屬性'保持爲空。

你知道我在做什麼錯嗎? 在此先感謝您的幫助!

+0

我建議具有屬性作爲'JsonObject',然後直接將JSON轉換爲'Map '。 – Srinivas

+0

你的代碼在一個小問題上工作得很好:你似乎已經創建了一個名爲'builder'的GsonBuilder',然後使用了一個名爲'gsonBuilder'。如果這實際上是編譯,那麼你有另一個你以前創建的'GsonBuilder',並且錯誤地使用它。除此之外......它可以在我的機器上反序列化。 –

+0

'gsonBuilder'在編寫主題時出錯。它是我在代碼中使用的「構建器」。我會編輯我的話題進行更正。 「屬性」字段在您的測試中正確注入?它非常奇怪,它保持爲null ... –

回答

9

對於我這個代碼:

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(); 
} 

打印此:

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: {} 

但是,請記住,我有我分析文件中剝離包裝JSON對象。該文件是:

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

      } 
     } 
} 

而且我加右雙報價爲nameid,你沒有你的樣品中有。按照OP要求的User類。我已經添加了打印的原因getter和setters:

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

你可以發佈你使用的'user'對象嗎?我嘗試你的代碼,但'屬性'總是'null' ...我在JDK7和Gson 2.2.2上,如果我可以幫忙... –

+0

@FranckYapadesouciAnso:已添加。 Gson 2.1,java 1.7 –

+0

好吧,我發現我的錯誤。這是FieldNamingPolicy的問題。謝謝你的幫助。祝你今天愉快! –

相關問題