使用Gson反序列化Map 字段

我有一个具有这种结构的User对象:

class User { private String id; private String name; private Map 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... } } } } 

属性的键是String,属性的值可以是String,int,Array,boolean,Map等。

我尝试用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() {}.getType()); 

字段’id’和’name’被正确注入,但字段’properties’保持为null。

你知道我做错了什么吗? 在此先感谢您的帮助!

对我来说这个代码:

 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和setter:

 import java.util.Map; class User { private String id; private String name; private Map 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 getProperties() { return properties; } public void setProperties(Map properties) { this.properties = properties; } }