是否可以使用杰克逊的其他属性进行序列化?

时间:2012-07-27 12:11:36

标签: java spring jackson

我正在尝试使用Jackson序列化类,以便序列化我的类以两种不同的方式发送属性(作为String和枚举)。我如何确定杰克逊实际上在不声明的情况下为JSON输出添加了不同的属性?

我的代码是

private LearningForm cnfpLearningOrganisationLearningForm;
......
/**
 * @return the cnfpLearningOrganisationLearningForm
 */
public String getCnfpLearningOrganisationLearningFormSearch() {
    return cnfpLearningOrganisationLearningForm.getValue();
}

/**
 * @return the cnfpLearningOrganisationLearningForm
 */
public LearningForm getCnfpLearningOrganisationLearningForm() {
    return cnfpLearningOrganisationLearningForm;
}

我希望杰克逊将其序列化为: {  ....  cnfpLearningOrganisationLearningForm:someValue  cnfpLearningOrganisationLearningFormSearch:differentValue  .... }

有没有办法在没有将cnfpLearningOrganisationLearningFormSearch声明为类中的(无序除序列化)字段的情况下执行此操作?

谢谢。

2 个答案:

答案 0 :(得分:0)

@JsonProperty注释,允许您动态评估属性值(如果您想要返回枚举和字符串,可以声明它返回Object,如果我正确理解了问题)

@JsonProperty("test")
public Object someProp(){
    if (condition) return SomeEnum.VALUE;
    else
        return "StringValue";
}

答案 1 :(得分:0)

  

有没有办法在没有将cnfpLearningOrganisationLearningFormSearch声明为类中的(无序除序列化)字段的情况下执行此操作?

是。默认情况下,Jackson将使用getter作为属性,而不考虑任何字段。因此,原始问题中描述的bean应该按照需要序列化,就好了。

以下代码演示了这一点(为了获得良好的衡量标准,引入了不必要的枚举)。

import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonFoo
{
  public static void main(String[] args) throws Exception
  {
    System.out.println(new ObjectMapper().writeValueAsString(new Bar()));
    // output: {"propertyAsValue":"some_value","propertyAsEnum":"VALUE"}
  }
}

class Bar
{
  public String getPropertyAsValue()
  {
    return MyEnum.VALUE.getValue();
  }

  public MyEnum getPropertyAsEnum()
  {
    return MyEnum.VALUE;
  }
}

enum MyEnum
{
  VALUE;

  public String getValue()
  {
    return "some_value";
  }
}