1

シリアル化のために、クラスが2つの異なる方法(文字列と列挙型)でプロパティを送信するように、ジャクソンでクラスをシリアル化しようとしています。Jackson が宣言せずに JSON 出力に別のプロパティを実際に追加することを決定するにはどうすればよいですか?

私のコードは

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

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

Jackson に次のようにシリアル化してもらいたい: { .... cnfpLearningOrganisationLearningForm : someValue cnfpLearningOrganisationLearningFormSearch : differentValue .... }

cnfpLearningOrganisationLearningFormSearch をクラスの (シリアル化以外は役に立たない) フィールドとして宣言せずにこれを行う方法はありますか?

ありがとうございました。

4

3 に答える 3

1

質問を正しく理解していれば、ミックスインでこれを解決できます。特に、エンティティを変更できない可能性があるためです。

于 2012-07-27T14:12:13.207 に答える
0

@JsonPropertyアノテーションがあり、プロパティ値を動的に評価できます(質問を正しく理解していれば、列挙と文字列の両方を返したい場合は、オブジェクトを返すように宣言できます)

@JsonProperty("test")
public Object someProp(){
    if (condition) return SomeEnum.VALUE;
    else
        return "StringValue";
}
于 2012-07-27T13:05:13.017 に答える
0

cnfpLearningOrganisationLearningFormSearch をクラスの (シリアライゼーション以外は役に立たない) フィールドとして宣言せずにこれを行う方法はありますか?

はい。デフォルトでは、ジャクソンはフィールドを考慮せずにゲッターをプロパティとして使用します。したがって、元の質問で説明されている 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 に答える