[英]Converting List to JSON in Java with correct extension
我正在嘗試使用不同的代碼創建一個錯誤List
,並使用gson
將它們轉換為JSON
。
String jsonString = gson.toJson(Errors.getErrors());
這是課程:
public class Errors {
private static List<SingleError> errors = new ArrayList<>();
public static List<SingleError> getErrors() {
return errors;
}
public static void addError(SingleError singleError) {
errors.add(singleError);
}
}
我得到的輸出:
[
{
"code": "bad_signal"
}
]
我需要的輸出:
{
"errors": [
{
"code": "bad_signal"
}
]
}
我在Errors
類中缺少什么以獲得我需要的輸出?
如果將它添加到類中而不只是將字符串添加到json轉換中會更好。
編輯
正如 schomsel 所建議的,我應該使用這一行來獲得我需要的輸出。
gson.toJson(Collections.singletonMap("errors", Errors.getErrors()))
它確實有效,但我沒有提到我也在使用Servlet
返回字符串並設置此標頭,這會刪除“錯誤”。
resp.setHeader("Content-Type", "application/json");
我需要在這里使用的正確標題是什么?
顯然,您應該了解所需的 json 表示是針對Errors
類本身而不是包含erros
列表,因此您的代碼將被調整以便您可以將Errors
類實例作為輸入傳遞給 - gson.toJson(...)
兩種解決方案,
第一個解決方案 - 使Errors
字段和方法非靜態並傳遞Errors
實例而不是errors
列表來調用 - gson.toJson(ErrorsInstance);
import java.util.ArrayList;
import java.util.List;
import com.google.gson.Gson;
class Errors {
private List<SingleError> errors = new ArrayList<>();
public List<SingleError> getErrors() {
return errors;
}
public void addError(SingleError singleError) {
errors.add(singleError);
}
第二種解決方案 - 如果不能將字段和方法設為靜態,則添加一個新方法以通過私有構造函數獲取Errors
實例,然后從GsonBuilder
創建Gson
對象,以便在序列化期間可以包含靜態字段。
import java.util.ArrayList;
import java.util.List;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
class Errors {
// private constructor
private Errors(List<SingleError> errors) {
Errors.errors = errors;
}
private static List<SingleError> errors = new ArrayList<>();
public static List<SingleError> getErrors() {
return errors;
}
// New method to return Errors instance
public static Errors getErrorsInstance() {
return new Errors(errors);
}
public static void addError(SingleError singleError) {
errors.add(singleError);
}
}
//在序列化期間包含靜態字段並僅忽略瞬態字段-如果未完成,則 json 將為空
GsonBuilder gsonBuilder = new GsonBuilder();
// Allowing the serialization of static fields
gsonBuilder.excludeFieldsWithModifiers(java.lang.reflect.Modifier.TRANSIENT);
// Creates a Gson instance based on the current configuration
Gson gson = gsonBuilder.create();
Errors errorsInstance = Errors.getErrorsInstance();
String jsonStringTest = gson.toJson(errorsInstance );
編輯:
對於第二種解決方案,您不需要私有構造函數和新方法 - getErrorsInstance()
。 您可以簡單地將new Errors()
給gson.toJson(...)
。 您需要的只是反序列化中包含的靜態字段,同樣適用於解決方案#1。 所以你不需要修改任何代碼,只需確保GsonBuilder
包含靜態字段並傳遞Errors
實例而不是包含列表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.