如何使用GSON将JSON字段转换为JAVA映射

时间:2019-01-10 14:57:56

标签: java json gson

我有一个如下所示的JSON数据:

{
 "status": "status",
 "date": "01/10/2019",
 "time": "10:30 AM",
 "labels": {
     "field1": "value1",
     "field2": "value2",
     ...
     "field100": "value100"
 }
 "description": "some description"
}

在我的Java代码中,我有两个类:

  1. Alerts类,具有以下字段-状态,日期,时间,描述和Labels类。

  2. 内部Labels类应该容纳从field1field100(以及更多)的所有字段

我正在像这样将JSON解析为GSON:

Alerts myAlert = gson.fromJson(alertJSON, Alert.class);

上面的代码将JSON解析为Alert对象和Labels对象。

问题: 如何将Labels对象中的字段(field1field2等)映射为单个String字段,而不是将它们解析为映射?

例如,Labels对象看起来像这样:

public class Labels {

   // I want to parse all the fields (field1, field2, etc) into 
   // this map
   Map<String, String> fields = new HashMap<>(); 

}

我该怎么做?

3 个答案:

答案 0 :(得分:2)

您可以使用TypeToken直接指定标签。

git log

答案 1 :(得分:2)

像这样声明Alert对象:

public class Alert {
    private String description;
    private String status;
    private Map<String, String> labels;
    ...
}

为我工作,并且此代码

Alert myAlert = gson.fromJson(alertJSON, Alert.class);
System.out.println(myAlert.getLabels());

将地图打印为{field1=value1, field2=value2, field100=value100}

因此不需要中间对象

答案 2 :(得分:1)

对于一般情况-一种更灵活的方式:gson可以注册类型适配器:

names(which(rowSums(Reduce(`&`, list(df[-ncol(df)] < -1.7, df[-1] < -1.7))) > 0))
#[1] "1977" "1979" "1980" "1982" "1983" "1985"

针对您的情况的反序列化器是:

Gson gson = new GsonBuilder().registerTypeAdapter(Labels.class, new LabelsDeserializer()).create();

要进行序列化,需要实现JsonSerializer <...>