使用类名作为 JSON Jackson 序列化的根键

2022-09-01 08:03:02

假设我有一个 pojo:

import org.codehaus.jackson.map.*;

public class MyPojo {
    int id;
    public int getId()
    { return this.id; }

    public void setId(int id)
    { this.id = id; }

    public static void main(String[] args) throws Exception {
        MyPojo mp = new MyPojo();
        mp.setId(4);
        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(SerializationConfig.Feature.WRAP_ROOT_VALUE, true);
        System.out.println(mapper.getSerializationConfig().isEnabled(SerializationConfig.Feature.WRAP_ROOT_VALUE));
        System.out.println(mapper.writeValueAsString(mp));
    }
}

当我使用 Jackson ObjectMapper 进行序列化时,我只能得到

true
{"id":4}

但我想要

true
{"MyPojo":{"id":4}}

我到处搜索,杰克逊的文档真的很没有组织,而且大多已经过时了。


答案 1

通过在类级别中添加 jackson 注释,您可以获得预期的输出。我只是在你的班级中添加了无变化。@JsonTypeInfo

package com.test.jackson;

import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;

import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;

@JsonTypeInfo(include=As.WRAPPER_OBJECT, use=Id.NAME)
public class MyPojo {
    // Remain same as you have
}

输出:

{
    "MyPojo": {
        "id": 4
    }
}

答案 2

我没有使用jackson,但是搜索我发现了这个配置,这似乎是你想要的:WRAP_ROOT_VALUE

可以启用的功能,使根值(通常是 JSON 对象,但可以是任何类型)包装在单个属性 JSON 对象中,其中键作为“根名称”,由注释内省器(特别是对于使用 @XmlRootElement.name 的 JAXB)或回退(非限定类名)确定。功能部件主要用于实现 JAXB 兼容性。

默认设置为 false,表示不换行根值。

以便您可以配置映射器:

objectMapper.configure(SerializationConfig.Feature.WRAP_ROOT_VALUE, true);

我希望它能帮助你...