Преобразование списка в JSON в Java с правильным расширением - PullRequest
0 голосов
/ 26 октября 2018

Я пытаюсь создать List ошибок с различными кодами и преобразовать их в JSON, используя gson.

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.

РЕДАКТИРОВАТЬ
Как предложил Шомсель, я должен использовать эту строку, чтобы получитьвывод, который мне нужен.

gson.toJson(Collections.singletonMap("errors", Errors.getErrors()))

И это сработало, но я не упомянул, что я также использую Servlet для возврата String и установки этого заголовка, который удаляет «ошибки».

resp.setHeader("Content-Type", "application/json");

Какой правильный заголовок мне нужно использовать здесь?

1 Ответ

0 голосов
/ 26 октября 2018

Очевидно, вы должны понимать, что желаемое представление 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 через приватный конструктор, а затем создайте объект Gson из GsonBuilder, чтобы статические поля могливключен во время сериализации.

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 экземпляр вместо содержимого списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...