【问题标题】:JACKSON: How to ignore the POJO name while converting a POJO to JSON using Jackson?JACKSON:如何在使用 Jackson 将 POJO 转换为 JSON 时忽略 POJO 名称?
【发布时间】:2020-09-07 22:35:48
【问题描述】:

我正在使用 Jackson 2.10.1 库将我的 Java POJO 转换为 JSON,我得到以下输出,我需要没有 POJO 名称的输出(此处为 MyTestPojo),我尝试了各种杰克逊注释,如 @JsonIgnoreProperties 但那些主要用于 POJO 中存在的成员,而不是 POJO 类名。

{
    "MyTestPojo": [
        {
            "CreatedBy": "user1",
            "Name": "testABC",
            "UpdatedBy": null,
            "UpdatedDate": null,
            "IsActive": true,
            "Value": "testABC1",
            "CreatedDate": "2017-03-13 15:41:54.0",
            "Description": "testABC"
        },
        {
            "CreatedBy": "user2",
            "Name": "testABC",
            "UpdatedBy": null,
            "UpdatedDate": null,
            "IsActive": false,
            "Value": "testABC2",
            "CreatedDate": "2017-03-13 15:41:54.0",
            "Description": "testABC"
        }
    ]
}

而我需要的是 -

[
        {
            "CreatedBy": "user1",
            "Name": "testABC",
            "UpdatedBy": null,
            "UpdatedDate": null,
            "IsActive": true,
            "Value": "testABC1",
            "CreatedDate": "2019-03-13 15:41:54.0",
            "Description": "testABC"
        },
        {
            "CreatedBy": "user2",
            "Name": "testABC",
            "UpdatedBy": null,
            "UpdatedDate": null,
            "IsActive": false,
            "Value": "testABC2",
            "CreatedDate": "2020-03-10 15:41:54.0",
            "Description": "testABC"
        }
    ]
}

有没有办法用 Jackson 注释来处理这个问题?

我用过的POJO是-

@JacksonXmlRootElement(localName = "ArrayOfTestPojos")
public class GetResponseVO {

    @JsonProperty("MyTestPojo")
    @JacksonXmlProperty(localName = "MyTestPojo")
    @JacksonXmlElementWrapper(useWrapping = false)
    private ArrayList<MyTestPojo> MyTestPojoList;

    public ArrayList<MyTestPojo> getMyTestPojoList() {
        return MyTestPojoList;
    }

    public void setMyTestPojoList(ArrayList<MyTestPojo> MyTestPojoList) {
        this.MyTestPojoList = MyTestPojoList;
    }

// standard getters and setters

}

@JacksonXmlRootElement(localName = "MyTestPojo")
public class MyTestPojo {

    @JsonProperty("Name")
    private String name;

    @JsonProperty("Description")
    private String description;

    @JsonProperty("IsActive")
    private int isActive;

    @JsonProperty("Value")
    private String value = null;

    @JsonProperty("CreatedBy")
    private String createdBy;

    @JsonProperty("CreatedDate")
    private String createdDate;

    @JsonProperty("UpdatedBy")
    private String updatedBy;

    @JsonProperty("UpdatedDate")
    private String updatedDate;

// standard getters and setters.    
}
```````````
I am also generating the XML out of this so you can ignore the annotations relevant to XML.

【问题讨论】:

  • 请在您的问题中添加相关的 POJO 和您尝试过的内容。
  • @PieterjanDeconinck 添加了
  • 不确定杰克逊注解是否可行。您可以尝试编写自定义反序列化器。

标签: java json marshalling jackson-databind jackson2


【解决方案1】:

您可以为此目的使用JsonValue 注释,它基本上是“使用此属性的值而不是序列化容器对象”。也可以在getters上使用

@JsonValue 表示带注释的“getter”方法的结果(这意味着签名必须是 getter 的签名;非 void 返回类型,无参数)将用作实例序列化的单个值。通常 value 是一个简单的标量类型(String 或 Number),但它可以是任何可序列化的类型(Collection、Map 或 Bean)。

@JsonValue
@JacksonXmlProperty(localName = "MyTestPojo")
@JacksonXmlElementWrapper(useWrapping = false)
private ArrayList<MyTestPojo> MyTestPojoList;

但这是错误的做法,因为它会生成这样的 JSON,这是不合法的JSON

{[{"x":"value"}, ...]}

如果你只想改变 JSON 结构(不影响 xml),你可以使用 MixIn 来达到这个目的。

public interface JsonMixin {

   @JsonValue
   List<MyTestPojo> getMyTestPojoList();   
}

然后将其注册到您的对象映射器并从主类中删除 @JsonValue

objectMapper.addMixIn(GetResponseVO.class, JsonMixin.class);

【讨论】:

  • 它确实有效,我得到了我需要的 JSON,但正如我在问题部分中提到的,我还将它转换为 XML(根据用户请求,它可以是 JSON 或 XML)并使用@JsonValue XML 代码失败并出现错误“com.fasterxml.jackson.core.JsonGenerationException: Trying to output second root,
  • @StuckProgrammer 我和你有同样的要求,xml和json,但是包装器仍然显示在json中,你找到答案了吗?
猜你喜欢
  • 2022-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-21
  • 2015-10-19
  • 2014-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多