java - 使用 Gson 反序列化 Map<String, Object> 字段

标签 java json 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...
            }
        }
    }
}

属性的键是字符串,属性的值可以是字符串、整数、数组、 boolean 值、映射等。

我尝试像这样用 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”已正确注入(inject),但字段“properties”保持为空。

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

最佳答案

对我来说,这段代码:

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

关于java - 使用 Gson 反序列化 Map<String, Object> 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14263114/

相关文章:

Java 通用 lambda 记忆化

java - ThreadLocal 与新局部变量相比的真正优势

java - 验证 Wicket 中的图像尺寸

java - 如何使用 Jackson 的 ObjectMapper 将以下 JSON 转换为 POJO

arrays - 将数据打印到 TableView 时出现问题(Swift)

java - 如何改变CollapsingToolbarLayout 标题的方向?

javascript - 我应该为不同的设备单独制作 "responding script"吗?

java - 如何将任意 JSON 转换为 Java 中可用的结构

java - 使用 Gson 将 jsonObject 读取为 MyClass<T>

java - gson\json反序列化错误