1

我试图用杰克逊序列化一个类,以便序列化我的类以两种不同的方式发送一个属性(作为字符串和枚举)。我如何确定杰克逊在不声明的情况下实际向 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 声明为类中的(除了序列化之外无用)字段的情况下做到这一点?

谢谢你。

4

3 回答 3

1

如果我正确理解了这个问题,您可以使用mixins解决这个问题。特别是因为听起来您可能无法修改实体。

于 2012-07-27T14:12:13.207 回答
0

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

@JsonProperty("test")
public Object someProp(){
    if (condition) return SomeEnum.VALUE;
    else
        return "StringValue";
}
于 2012-07-27T13:05:13.017 回答
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";
  }
}
于 2012-07-27T18:18:40.157 回答