反序列化映射< String,Object>领域与Gson [英] Deserializing a Map<String, Object> field with Gson

查看:129
本文介绍了反序列化映射< String,Object>领域与Gson的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  class User {
private String id;
私人字符串名称;
私人地图< String,Object>性能;

// GETTERS& SETTERS
}

我有这种结构的JSON字符串:

  {
user:{
id:123456789,
name:azerty,
emailHash:123456789,//未在用户类中使用
properties:{
p1:1,
p2:test,
p3:[1,2,3,4],
p4:{
etc ...
}
}
}





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

我试图用Gson反序列化这个JSON字符串:

<$ p $ JSONParser解析器=新的JsonParser();
JsonElement元素= 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'被正确注入,但字段'属性'保持为空。 / p>

你知道我做错了吗?
感谢您的帮助!

解决方案

对于我来说这个代码:

  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属性));
}
reader.close();

$ / code $ / pre
$ b $打印此:

$ b < pre $ lt; code> azerty
123456789
键:p1值:1.0
键:p2值:test
键:p3值:[1.0,2.0 ,3.0,4.0]
键:p4值:{}

但请记住我已经剥离了我解析的文件中的包装json对象。该文件是:

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

}
}
}

另外,我添加了 name id的结尾双引号,你在样本中没有。

User 由OP。由于打印的原因,我添加了getter和setter:

  import java.util.Map; 

class用户{
私人字符串ID;
私人字符串名称;
私人地图< String,Object>性能;
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(){
返回属性;
}
public void setProperties(Map< String,Object> properties){
this.properties = properties;
}
}


I have a User object with this structure:

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

    // GETTERS & SETTERS
}

I have a JSON String with this structure:

{
    "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' keys are String, Properties' values can be a String, int, Array, boolean, Map etc.

I try to deserialize this JSON string with Gson like that:

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

Fields 'id' and 'name' are correctly injected but the field 'properties' stays null.

Do you know what I'm doing wrong? Thanks in advance for your help!

解决方案

For me this code:

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 this:

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

However, keep in mind that I have stripped the wrapping json object in the file I parse. The file is:

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

            }
        }
}

Also I added closing double quote for name and id, which you did not have in your sample.

The User class as requested by the OP. I have added getters and setters for the reason of printing:

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

这篇关于反序列化映射&lt; String,Object&gt;领域与Gson的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆