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

如何使用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

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

{
 "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
    (以及更多)的所有字段

  • 我将此JSON解析为GSON,如下所示:

    {
     "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