2013-01-10 32 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的问题。谢谢你的帮助。祝你今天愉快! –

相关问题