3

アンケートを表すオブジェクトの構造があり、JSONにシリアル化する必要があります。構造の1つのクラスはOpenQuestionであり、このクラスは2つのパラメーターを持つジェネリックを使用します。問題は、使用されたタイプの1つがDateであったときに始まり、日付がlongのように間違ってシリアル化されます。

クラスコード:

public class OpenQuestion <valueType,validationType> extends AbstractQuestion implements    Serializable {
    private valueType value;
    private validationType minValue;
    private validationType maxValue;
    ...
}

ハッシュマップが常にDateを使用する場合、ハッシュマップで日付をシリアル化する方法を見ましたが、この場合、String、Integer、またはDateのクラスを使用します。

それを解決するためのアイデアはありますか?ありがとう

4

3 に答える 3

7

JsonTypeInfoこのための注釈を追加できます。これを使用する2つの方法があります:

  • オブジェクトに型アノテーションを自動的に追加するように取得して、オブジェクトを逆シリアル化する対象を認識します。
  • これを処理するために、カスタムタイプリゾルバーを追加します。

1つ目は、JSONを醜くしますが、追加のコードはほとんど必要なく、カスタムシリアライザーを作成する必要はありません。後者はより困難ですが、よりクリーンなJSONになります。全体的な問題の一部は、タイプの1つがJSON(日付)でモデル化されていないため、JSONファイルで整数型または文字列型としてシリアル化する必要がある可能性があります。

前者のオプションは次のようになります。

@JsonTypeInfo( use = Id.CLASS, include = As.WRAPPER_PROPERTY )
private valiationType minValue;

これは、たとえば文字列値を次のようにエンコードする必要があります。

{ __type = "java.lang.String", value = "Hello, World" }

これは主にメモリからのものであるため、それが正確であるという約束はありません!

于 2012-11-17T17:27:09.230 に答える
4

場合によります。予想されるタイプがわかっている場合は、汎用タイプ参照を渡すだけです。

OpenQuestion<Value,Validation> v = objectMapper.readValue(json,
  new TypeReference<OpenQuestion<Value,Validation>>() { });

それがジャクソンの予想されるタイプの手がかりになるからです。

あなたがそれを知らないならば、他の答えは使い方を示しています@JsonTypeInfo

于 2012-11-19T20:48:15.443 に答える
2

@MiserableVariableが指摘しているように、Jacksonは(ほとんどの)日付フィールドをデフォルトで(数値の長い)タイムスタンプとしてシリアル化します。この動作は、さまざまな方法でオーバーライドできます。

ObjectMapperの独自のインスタンスを使用する場合は、プロパティをオーバーライドして、日付をISO-8601として書き込みます。

objectMapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false);

ObjectMapperの独自のインスタンスを使用する場合、独自のカスタム形式で日付を書き込むには、次のようにします。

objectMapper.setDateFormat(myDateFormat); // 1.8 and above
objectMapper.getSerializationConfig().setDateFormat(myDateFormat); // for earlier versions (deprecated for 1.8+)

ほとんどのフィールドでデフォルトのシリアル化動作を残し、特定のオブジェクトの特定のフィールドでオーバーライドするには、カスタムシリアライザーを使用します。

public class MyBean implements Serializable {
    private Date postDate;

    // ... constructors, etc

    @JsonSerialize(using = MyCustomDateSerializer.class)
    public Date getPostDate() {
        return postDate;
    }
}

public class MyCustomDateSerializer extends JsonSerializer<Date> {

    @Override
    public void serialize(final Date date, final JsonGeneraror generator,
          final SerializerProvider provider) throws IOException,
          JSONProcessingException {

        generator.writeString(yourRepresentationHere);
    }
}

この情報はすべてJacksonのドキュメントで入手でき、その大部分は日付の処理を扱うセクションにあります。

于 2012-11-17T17:57:28.140 に答える