保持空值– Java POJO到org.JSONObject

时间:2019-02-26 17:40:26

标签: java json spring-boot serialization org.json

我正在使用Spring Boot在Java中创建RESTful API服务。我有一个尝试从其创建JSON对象的类。一切工作都很好-除了类实例中的json对象忽略了空值。我想保留键并将其值设置为null,而不是从输出中完全剥离它们。

输出如下(为简洁起见,简称

    "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.put("answer", JSONObject.NULL)手动创建JSONObject之外,还有其他方法可以保留这些空值吗?

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

尝试将spring.jackson.default-property-inclusion=always添加到您的application.properties中。

另外,请查看spring.jackson系列中的其他设置,以了解JSON序列化的其他设置。

答案 1 :(得分:0)

当您使用构造函数JSONObject创建新的public JSONObject(Object bean)时,内部实现会跳过所有null的值。要保留null -s,您必须自己创建并填充新的JSONObject

从另一面看,您不需要使用org.json.*库。您可以使用MapList来构造类似的结构。参见以下结构:

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属性启用null或添加JsonInclude批注:

@JsonInclude(JsonInclude.Include.ALWAYS)
public class JsonQuestionObject