2017-07-19 2 views
1

残りのAPIでjacksonを使用すると、ちょっとした快適性の問題があります。私はジャクソンが、このようなものを生成するために使用することができますjacksonは、1つのjava属性の2つのjson属性を作成します。

public class DomainObject{ 
    public LocalDateTime start; 
} 

::私のようなjava.timeに任意の型の属性を持つオブジェクトシリアル化するためにジャクソンを使用しています

{ 
    start: '2017-12-31 17:35:22' 
} 

を、私はそれを使用することができますこのような何かを生成:

{ 
    start: 102394580192345 //milliseconds 
} 

をしかし、私はミリ秒JSと純粋にウィット残り-APIを使用するユーザーのための文字列表現にworkwithし、両方を持っていると思いますhout js-frontend。 (ほとんど私、デバッグのために)

それでは、ジャクソンが次のようにする方法はありますか?

{ 
    start: 102394580192345 //milliseconds 
    startString: '2017-12-31 17:35:22' 
} 

答えて

2

カスタムジャクソンシリアライザを作成して、アプリケーションに登録する必要があります。その後、そのdataTypeが出現するたびにこのようにシリアル化されます。たとえシリアル化するデータ型が別のデータ型の内部にあっても。 (あなたの例と同じように)

注:私のアプリケーションでは、ZonedDateTimeのために書きましたので、LocalDateTime用に書きません。あなたのニーズに合わせて書き直すのは難しい作業ではありません。

public class ZonedDateTimeSerializer extends JsonSerializer<ZonedDateTime> 
{ 

    @Override 
    public void serialize(ZonedDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException 
    { 
    gen.writeStartObject(); 
    gen.writeFieldName("timestamp"); 
    gen.writeString(Long.toString(value.toInstant().toEpochMilli())); 
    gen.writeFieldName("offset"); 
    gen.writeString(value.getOffset().toString()); 
    gen.writeFieldName("zone"); 
    gen.writeString(value.getZone().toString()); 
    gen.writeFieldName("ts"); 
    gen.writeString(StringUtils.convertZonedDateTimeToISO8601String(value)); 
    gen.writeEndObject(); 
    } 

} 

それは、このようジャクソンのObjectMapperに登録されます。このプロセスでは、私はいつもこのシリアライザとobjectMapperを返しますプロデューサー(CDI)を作成することをお勧めしますが

objectMapper = new ObjectMapper(); 
    SimpleModule module = new SimpleModule("MyModule"); 
    module.addSerializer(ZonedDateTime.class, new ZonedDateTimeSerializer()); 
    objectMapper.registerModule(module); 

デフォルトで追加されます。しかし、私が研究するのはあなた次第そのタスクを残す;)

+1

私は必要なものとまったく同じように聞こえます。明日に試してみます。 thx –

2

を簡単な方法は、余分なJSONフィールドとして文字列変換を自分で行うには、次のようになります。

public class DomainObject { 
    private LocalDateTime start; 

    @JsonProperty("startString") 
    public String formatStartDate() { 
    // use a date formatter to format the date as string here 
    } 
} 

ジャクソンは通常通りstartをシリアル化し、あなたでしょう追加のJSONフィールドを追加しましたstartString

+1

今後の読者には、このソリューションも完璧に機能していることを指摘したいと思います。ただし、ユースケースが必要なのはその位置で一度だけ必要であることがわかっている場合のみです。カスタムシリアル化が複数の場所または全般で必要であることがわかっている場合は、カスタムのjacksonシリアライザが優先されます。 _in私の意見_ 解決策はまだ+1です。 – Nico

関連する問題