Сохранить нулевые значения - Java POJO для org.JSONObject - PullRequest
0 голосов
/ 26 февраля 2019

Я создаю службу RESTful API в Java с использованием Spring Boot.У меня есть класс, из которого я пытаюсь создать объект JSON.Все работает отлично, за исключением того, что объект json из экземпляра класса пропускает нулевые значения.Я хотел бы сохранить ключи и установить значение на ноль, а не удалять их полностью из вывода.

Вывод выглядит следующим образом (для краткости сокращен)

    "questions": [
        {
            "question": "question1",
            "svg": "svg1",
            "questionNum": 1
        },
        {
            "question": "question2"
            "svg": "q2",
            "questionNum": 2
        }
    ],

Предпочтительный вывод

    "questions": [
        {
            "question": "question1",
            "svg": "svg1",
            "questionNum": 1, 
            "shuffledNum": null, 
            "answer": null

        },
        {
            "question": "question2"
            "svg": "q2",
            "questionNum": 2,
            "shuffledNum": null,
            "answer": null 
        }
    ],

Вот объект JsonQuestionObject:

public class JsonQuestionObject {

    private Integer questionNum;
    private String svg;
    private Integer shuffledNum = null;
    private String question;
    private Integer answer = null;

    //Getters & Setters
}

Вот метод JSON Creator (который принимает массив JsonQuestionObjects)

public JSONObject createQuestionsJson(ArrayList<JsonQuestionObject> questions) {
    JSONObject output = new JSONObject();
    JSONArray content = new JSONArray();
    JSONObject subContent = new JSONObject();
    JSONArray qarray = new JSONArray();


    for (int i = 0; i < questions.size(); i++) {
        JsonQuestionObject q = questions.get(i);
        Integer qnum = q.getQuestionNum();
        JSONObject qitem = new JSONObject(q);

        if (qnum < 5) {
            qarray.put(qitem);
        } else if (qnum > 4 && qnum < 7) {
            qarray.put(qitem);
        } else if (qnum > 6 && qnum < 9 ) {
            qarray.put(qitem);
        } else if (qnum > 8 &&) {
            qarray.put(qitem);
        }
    }
    subContent.put("questions", qarray);
    content.put(subContent);
    output.put("output", content);

    return output;
}

Есть ли способ сохранить эти нулевые значения, кроме создания JSONObject вручную, используя методы установки и получения каждого свойства и установки JSONObject.put("answer", JSONObject.NULL)?

Очень признателен за любую помощь.

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

При создании нового JSONObject с конструктором public JSONObject(Object bean) все значения null пропускаются внутренней реализацией.Чтобы сохранить null -s, вы должны сами создать и заполнить новый JSONObject.

С другой стороны, вам не нужно использовать библиотеку org.json.*.Вы можете построить аналогичную структуру, используя Map s и List s.См. Ниже структуру:

JsonQuestionObject[] questionArray = {new JsonQuestionObject()};
HashMap<String, Object> questions = new HashMap<>();
questions.put("questions", questionArray);

List<Object> questionsList = new ArrayList<>();
questionsList.add(questions);

Map<String, Object> result = Collections.singletonMap("output", questionsList);

Вы можете вернуть Map в вашем методе, и он будет автоматически сериализован в JSON.Вы можете включить пустые значения, используя Spring Boot свойства или добавить JsonInclude аннотацию:

@JsonInclude(JsonInclude.Include.ALWAYS)
public class JsonQuestionObject
0 голосов
/ 26 февраля 2019

Попробуйте добавить spring.jackson.default-property-inclusion=always к вашему application.properties.

Кроме того, посмотрите другие настройки семейства spring.jackson для других настроек сериализации JSON.

...