Spring Boot (Jackson):如何避免类名被序列化为 JSON

Posted

技术标签:

【中文标题】Spring Boot (Jackson):如何避免类名被序列化为 JSON【英文标题】:Spring Boot (Jackson): How to avoid class name being serialized to JSON 【发布时间】:2016-09-08 02:23:56 【问题描述】:

我正在使用一些从 REST 应用程序公开的 XML,并希望在我自己的 REST 服务中将其公开为 JSON。

现在我有以下 POJO:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = 
    "salesMarket"
)
@XmlRootElement(name = "salesMarkets")
public class SalesMarkets 

protected List<SalesMarket> salesMarket;

public List<SalesMarket> getSalesMarket() 
    if (salesMarket == null) 
        salesMarket = new ArrayList<SalesMarket>();
    
    return this.salesMarket;
   


生成以下 JSON:

  "salesMarkets": 
"salesMarket": [
  
    "brands": 
      "brand": [
        "DAN"
      ]
    ,
    "code": "999"
  ,
  
    "brands": 
      "brand": [
        "DAN"
      ]
    ,
    "code": "208"
  
]

我的问题是(使用 Jackson 注释),有没有办法避免类名被序列化为 JSON??所以我会:

    "salesMarket": [
    "brands": 
        "brand": [
            "DAN"
        ]
    ,
    "code": "999"
, 
    "brands": 
        "brand": [
            "DAN"
        ]
    ,
    "code": "208"
]

我在想一些关于 SalesMarkets 类的 Jackson 注释......但还没有成功:-(

更新:

刚刚意识到 SalesMarket 类是从另一个类引用的 - 这就是“salesMarkets”出现在 JSON 中的原因。有没有办法注释 SalesMarkets 字段,以便忽略它而不是其中包含的字段?:

@XmlRootElement(name = "product")
public class Product 

@XmlElement(required = true)
protected String propertyID;
@XmlElement(required = true)
protected String season;
**protected SalesMarkets salesMarkets;**
protected Information information;
protected Features features;
protected Location location;
protected Address address;
protected Buildings buildings;
protected Pictures pictures;
protected Media media;
protected Prices prices;
protected Offers offers;
protected Availabilities availabilities;
protected Services services;
protected Concepts concepts;
...

【问题讨论】:

Product 不为空的 salesMarkets 实例的预期 json 是什么? 当前输出为: "propertyID": "D7612", "season": "2016", "salesMarkets": "salesMarket": [ "brands": "brand": [ "DAN" ] , "code": "999" , "brands": "brand": [ "DAN" ] , "code": "208" ] ,........ 我想去掉多余的 "salesMarkets":,据我了解,它来自 Product.class 中的参考 【参考方案1】:

您需要删除

@XmlRootElement(name = "salesMarkets")

或者在ObjectMapper上禁用the feature:

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

要进一步展开Product 实例中的salesMarkets 字段,您可以执行以下操作:

public class Product 
  protected SalesMarkets salesMarkets;

  public List<SalesMarket> getSalesMarkets()
     if(salesMarkets != null)
       return salesMarkets.getSalesMarket();
      else 
       return null;
     
  

【讨论】:

感谢您的快速回复,不幸的是我的问题有所改变,请参阅上面的更新。 完美运行!你刚刚拯救了我的一天 - 谢谢:-)

以上是关于Spring Boot (Jackson):如何避免类名被序列化为 JSON的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot (Jackson):如何避免类名被序列化为 JSON

如何将 Spring Boot 映射器从 Jackson 交换到 kotlinx.serialization

如何在 Spring Boot 中为 Camel 配置 Jackson ObjectMapper

如何使用 Spring Boot 为嵌套实体配置 Jackson 反序列化器

如何在 Spring Boot REST API 中启用对 JSON / Jackson @RequestBody 的严格验证?

如何在spring boot应用程序中配置Jackson而不覆盖纯java中的springs默认设置