如何使用GSON将JSON字段转换为JAVA映射
我有一个JSON数据,如下所示:如何使用GSON将JSON字段转换为JAVA映射,java,json,gson,Java,Json,Gson,我有一个JSON数据,如下所示: { "status": "status", "date": "01/10/2019", "time": "10:30 AM", "labels": { "field1": "value1", "field2": "value2", ... "field100": "value100" } "description": "some description" } Alerts myAlert = gson.fro
{
"status": "status",
"date": "01/10/2019",
"time": "10:30 AM",
"labels": {
"field1": "value1",
"field2": "value2",
...
"field100": "value100"
}
"description": "some description"
}
Alerts myAlert = gson.fromJson(alertJSON, Alert.class);
public class Labels {
// I want to parse all the fields (field1, field2, etc) into
// this map
Map<String, String> fields = new HashMap<>();
}
public class Alert {
private String description;
private String status;
private Map<String, String> labels;
...
}
在Java代码中,我有两个类:
警报
类,该类具有以下字段-状态、日期、时间、描述和标签类标签
类,用于保存从字段1
到字段100
(以及更多)的所有字段{
"status": "status",
"date": "01/10/2019",
"time": "10:30 AM",
"labels": {
"field1": "value1",
"field2": "value2",
...
"field100": "value100"
}
"description": "some description"
}
Alerts myAlert = gson.fromJson(alertJSON, Alert.class);
public class Labels {
// I want to parse all the fields (field1, field2, etc) into
// this map
Map<String, String> fields = new HashMap<>();
}
public class Alert {
private String description;
private String status;
private Map<String, String> labels;
...
}
上面的代码将JSON解析为警报
对象和标签
对象
问题:
如何将标签对象中的字段(field1
、field2
等)映射为单个字符串字段,而不是将它们解析为映射
例如,Labels对象将如下所示:
{
"status": "status",
"date": "01/10/2019",
"time": "10:30 AM",
"labels": {
"field1": "value1",
"field2": "value2",
...
"field100": "value100"
}
"description": "some description"
}
Alerts myAlert = gson.fromJson(alertJSON, Alert.class);
public class Labels {
// I want to parse all the fields (field1, field2, etc) into
// this map
Map<String, String> fields = new HashMap<>();
}
public class Alert {
private String description;
private String status;
private Map<String, String> labels;
...
}
公共类标签{
//我想将所有字段(field1、field2等)解析为
//这张地图
映射字段=新的HashMap();
}
如何执行此操作?您可以使用TypeToken直接指定标签
import java.lang.reflect.Type;
import com.google.gson.reflect.TypeToken;
Type mapType = new TypeToken<Map<String, String>>(){}.getType();
Map<String, String> myMap = gson.fromJson("{'field1':'value1','field2':'value2'}", mapType);
import java.lang.reflect.Type;
导入com.google.gson.reflect.TypeToken;
类型mapType=newTypeToken(){}.getType();
Map myMap=gson.fromJson(“{'field1':'value1','field2':'value2'}”,mapType);
像这样声明警报对象:
{
"status": "status",
"date": "01/10/2019",
"time": "10:30 AM",
"labels": {
"field1": "value1",
"field2": "value2",
...
"field100": "value100"
}
"description": "some description"
}
Alerts myAlert = gson.fromJson(alertJSON, Alert.class);
public class Labels {
// I want to parse all the fields (field1, field2, etc) into
// this map
Map<String, String> fields = new HashMap<>();
}
public class Alert {
private String description;
private String status;
private Map<String, String> labels;
...
}
将地图打印为{field1=value1,field2=value2,field100=value100}
因此,对于一般情况,不需要中间对象——一些更灵活的方法:gson可以注册类型适配器:
Gson gson = new GsonBuilder().registerTypeAdapter(Labels.class, new LabelsDeserializer()).create();
您案例的反序列化程序是:
public class LabelsDeserializer implements JsonDeserializer<Labels>
{
@Override
public Labels deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException
{
if (!jsonElement.isJsonNull())
{
Labels label = new Labels();
jsonElement.getAsJsonObject().entrySet().forEach(entry -> label.getFields().put(entry.getKey(), entry.getValue().getAsString()));
return label;
}
else
{
return null;
}
}
}
公共类LabelDeserializer实现JsonDeserializer
{
@凌驾
公共标签反序列化(JsonElement JsonElement,类型类型,JsonDeserializationContext JsonDeserializationContext)引发JsonParseException
{
如果(!jsonElement.isJsonNull())
{
标签=新标签();
jsonElement.getAsJsonObject().entrySet().forEach(条目->标签.getFields().put(条目.getKey(),条目.getValue().getAsString());
退货标签;
}
其他的
{
返回null;
}
}
}
为了进行序列化,需要实现JsonSerializer