保留空值——Java POJO 到 org.JSONObject

Posted

技术标签:

【中文标题】保留空值——Java POJO 到 org.JSONObject【英文标题】:Keep null values – Java POJO to org.JSONObject 【发布时间】:2019-07-20 08:02:48 【问题描述】:

我正在使用 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;

除了使用每个属性的 setter 和 getter 并设置 JSONObject.put("answer", JSONObject.NULL) 手动创建 JSONObject 之外,还有什么方法可以保留这些 null 值?

非常感谢您的帮助。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

我试图添加它,但它什么也没做。是否需要添加任何额外的依赖项才能使其正常工作?好像我根本没有使用杰克逊,因为我使用的是 org.json 依赖项? @user2868900,抱歉,我从不使用 org.json 库 - 我使用 jackson。我能建议的只有一个是寻找序列化程序设置 - 我想,它应该有类似的参数。【参考方案2】:

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

另一方面,您不需要使用org.json.* 库。您可以使用Maps 和Lists 构建类似的结构。见以下结构:

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

【讨论】:

以上是关于保留空值——Java POJO 到 org.JSONObject的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Protobuf-Net 中保留一个可为空值的数组?

将空值设置为缺失表字段的默认值

Java8 - 基于POJO更新多个列表。

pandas 结合两个 dfs:如果任一 df 在该索引处具有空值,则不保留

导入到 phpmyadmin 时如何设置空值?

JSON到POJO作为使用jackson java的对象类