java - 使用 GSON 将 JSON 转换为 Java 对象时如何覆盖 Java 映射?

标签 java android json gson

我有一个如下所示的 JSON 字符串:

{
 "status": "status",
 "date": "01/10/2019",
 "alerts": {
     "labels": {
         "field1": "value1",
         "field2": "value2",
         "field3": "value3",
         "field100": "value100"
     },
     "otherInfo" : "other stuff"
 },
 "description": "some description"
}

我对应的 Java 类如下所示:

public class Status {
    private String status;
    private String date;
    private Alerts alerts;
    private String description;
}

还有

public class Alerts {
    private Map<String, String> labels;
    private String otherInfo;

    public Map<String, String> getLabels() {
        return labels();
    }
}

我使用以下方法将给定的 JSON 解析为 Java 对象:

Status status = gson.fromJson(statusJSONString, Status.class);

这也为我提供了 Status 类中的 Alerts 对象:

Alerts alerts = status.getAlerts();

这是我的问题:

让我们考虑一下标签:

我想让label中的键映射不区分大小写。例如,如果提供的键/值对是 "field1": "value1""Field1": "value1""fIeLD1": “value1”,我希望能够通过简单地调用 alerts.getLabels.get("field1") 来检索它们。

理想情况下,我想在最初创建 labels 映射时将键设置为小写。我研究了 Gson 反序列化示例,但我不清楚如何解决这个问题。

最佳答案

您在这里无能为力。即使你扩展了HashMap,问题是当JSON反序列化时,它不会调用原生方法。您可以执行以下操作,但相当麻烦:

import java.util.HashMap;

public class HashMapCaseInsensitive extends HashMap<String, String> {

    private boolean convertedToLower = false;

    @Override
    public String put(String key, String value) {
        if(!convertedToLower){
            convertToLower();
        }
        return super.put(key.toLowerCase(), value);
    }

    @Override
    public String get(Object key) {
        if(!convertedToLower){
            convertToLower();
        }
        return super.get(key.toString().toLowerCase());
    }

    private void convertToLower(){
        for(String key : this.keySet()){
            String data = this.get(key);
            this.remove(key);
            this.put(key.toLowerCase(), data);
        }
        convertedToLower = true;
    }

}

关于java - 使用 GSON 将 JSON 转换为 Java 对象时如何覆盖 Java 映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54912746/

相关文章:

java - 如何在自定义操作类中设置区域设置并在另一个java类中获取它?

Java原始对象实例化: heap or not?

安卓 : how to get value from assets and pass it thru array

Android Instrumentation 启动 Activity

java - 预期为 BEGIN_ARRAY,但使用 GSON 时为 BEGIN_OBJECT

java - 将 ListView 绑定(bind)到 ObservableSet

java - junit 找不到类

java - 接下来的编辑文本字段遵循其自身

android - 如果我的列表为空,如何显示图像?

c# - mysql 整个数据库到 json 使用 c# 没有 datagridview