当前位置: 首页 > 面试题库 >

对象类型的Jackson JSON列表

闻人梓
2023-03-14
问题内容

我必须从对象列表中序列化JSON。生成的JSON必须看起来像这样:

{
    "status": "success",
    "models": [
        {
            "model": {
                "id": 23,
                "color": "red"
            }
        },
        {
            "model": {
                "id": 24,
                "color": "green"
            }
        }
    ]
}

当我简单地将其序列化时,我缺少类型/键“模型”:

List<Model> list = new ArrayList<Model>(); // add some new Model(...)
Response r = new Response("success", list); // Response has field "models"

相反,我只是得到这个:

{
    "status": "success",
    "models": [
        {
            "id": 23,
            "color": "red"
        },
        {
            "id": 24,
            "color": "green"
        }
    ]
}

如何为每个对象添加“模型”而不必编写带有属性“模型”的傻包装类?

我的课程如下:

public class Response {
    private String status;
    private List<Model> models;
    // getters / setters
}

public class Model {
    private Integer id;
    private String color;
    // getters / setters
}

问题答案:

没有内置的方法可以做到这一点。您必须自己编写JsonSerializer。就像是

class ModelSerializer extends JsonSerializer<List<Model>> {

    @Override
    public void serialize(List<Model> value, JsonGenerator jgen,
            SerializerProvider provider) throws IOException {
        jgen.writeStartArray();
        for (Model model : value) {
            jgen.writeStartObject();
            jgen.writeObjectField("model", model);
            jgen.writeEndObject();    
        }
        jgen.writeEndArray();
    }

}

然后注释该models字段,以便它使用它

@JsonSerialize(using = ModelSerializer.class)
private List<Model> models;

这将序列化为

{
    "status": "success",
    "models": [
        {
            "model": {
                "id": 1,
                "color": "red"
            }
        },
        {
            "model": {
                "id": 2,
                "color": "green"
            }
        }
    ]
}

如果要同时对此序列化和反序列化,则还需要一个自定义的反序列化器。



 类似资料:
  • 问题内容: 我不清楚序列化/反序列化应该如何在JavaScript中的类型化对象上工作。例如,我有一个“ MapLayer”对象,其中包含各种成员和数组。我已经编写(但尚未测试)以下代码以尝试对其进行序列化: 我的问题是,如何将生成的对象反序列化为MapLayer对象而不是通用对象。以及如何将所有Sprite实例反序列化为sprite。我应该使用“ new MapLayer()”而不是“ {}”吗

  • 我想通过Google Gson传输一个列表对象,但我不知道如何反序列化泛型类型。 我在看了这个之后尝试了什么(Balusc的回答): 编辑: 现在我有 但是,我确实在“FromJson”行得到以下异常: null

  • 本文向大家介绍js对象类型,基本对象类型以及引用对象类型的区别?相关面试题,主要包含被问及js对象类型,基本对象类型以及引用对象类型的区别?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 分为基本对象类型和引用对象类型 基本数据类型:按值访问,可操作保存在变量中的实际的值。基本类型值指的是简单的数据段。基本数据类型有这六种:undefined、null、string、number、bool

  • 我认为最好用一个例子来解释。 我有一个想要反序列化的JSON对象,它包含一个接口类型列表以及列表中的类型,但是我不确定如何让反序列化器确定列表中的具体类型: 要反序列化的类型 界面 儿童 我知道如果类型不是<code>List</code>,我可以将类型与<code>JsonSubTypes</code>一起使用,例如: 如果在父类型内,也是如此。但是当类型在类之外时,是否有一种方法可以帮助反序列

  • 假设我有两个列表,现在listOld包含旧员工信息,listNew包含新员工信息 我如何比较这两个列表并返回新列表,其中包含,添加的新员工列表,包含,删除的员工列表,包含上次更新已更改的员工的新列表? 我只能想到迭代列表和比较,可能最终几乎是O(n2)时间,这可以由任何util类更有效地完成吗?

  • 我有一个看起来很常见的问题,但到目前为止,我还没有找到一个适合我的解决方案。我想我只是错过了一些小事情,但我已经崩溃了,请求帮助。我正在尝试使用flask和pymongo获得json输出。 以下是控制台中使用print(结果)的对象: 当我试图返回时,我得到了错误: TypeError: ObjectId类型的对象不是JSON可序列化的 类联系人(资源): 我试过bson。json_util建议。