簡體   English   中英

如何使用GSON將JSON字段轉換為JAVA映射

[英]How to convert JSON fields into a JAVA map using 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<>(); 

}

我該怎么做呢?

您可以使用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);

像這樣聲明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}

這樣就不需要中間對象

對於一般情況-一些更靈活的方式: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;
        }
    }
}

為了進行序列化,需要實現JsonSerializer <...>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM