簡體   English   中英

使用正確的擴展名在 Java 中將列表轉換為 JSON

[英]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.

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