使用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":{ } } }
另外,我添加了name
和id
结束双引号,这是你的样本中没有的。
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; } }