2017-02-09 6 views
3

POJOの特定のフィールドに配列を逆シリアル化することができるジャクソンの注釈はありますか?私はカスタムデシリアライザで簡単にこれを行うことができますが、私はクラスでこれをインラインで行うことを望んでいました。Jacksonは配列要素を特定のフィールドに逆シリアル化します

たとえば、次のJSONがElasticsearchから戻ってきます。

{ 
    "_index": "twitter", 
    "_type": "tweet", 
    "_id": "AVodOsgk0etILSbJamY-", 
    "_score": null, 
    "_source": { 
     "tweetText": "I'm at Residencial Nova Alegria https:\/\/t.co\/4TyK8PAWzB", 
     "placeCountry": "Brasil", 
     "screenName": "wildelson", 
     "cleanedText": "I'm at Residencial Nova Alegria https:\/\/t.co\/4TyK8PAWzB", 
     "resolvedUrls": [ 
     "https:\/\/www.swarmapp.com\/c\/gfULJdQ6umw" 
     ], 
     "tweetId": "829272906291085314", 
     "tweetDate": 1486549042000 
    }, 
    "sort": [ 
     1486549042000, 
     "tweet#AVodOsgk0etILSbJamY-" 
    ] 
    } 

私のPOJOは、次のように:

import com.fasterxml.jackson.annotation.JsonInclude; 
import com.fasterxml.jackson.annotation.JsonProperty; 
import com.fasterxml.jackson.annotation.JsonPropertyOrder; 
import com.fasterxml.jackson.databind.annotation.JsonDeserialize; 
import lombok.Data; 

@Data 
@JsonInclude(JsonInclude.Include.NON_NULL) 
@JsonPropertyOrder(value = { 
    "enrichedStatus", 
    "sortValue", 
    "uid" 
}) 
public class TweetHit { 
    private final EnrichedStatus enrichedStatus; 
    private final Long sortValue; 
    private final String uid; 

    public TweetHit(EnrichedStatus enrichedStatus, Long sortValue, String uid) { 
     this.enrichedStatus = enrichedStatus; 
     this.sortValue = sortValue; 
     this.uid = uid; 
    } 

私はいつも長い列に[0]、配列内の文字列は、[1]、非直列化する必要があります「ソート」配列を、したいです

Long sortValue = sort[0] 
String uid = sort[1] 

唯一の回答はカスタムデシリアライザでしたが、できる限り回避したいと考えています。 Jackson: Deserialize JSON-Array in different attributes of an object

おそらく@JsonProperty("sort")@JsonFormat(shape = ARRAY)を使用することができますが、特定のセルを指定して各フィールドにデシリアライズすることはできません。

メモこれは不変なオブジェクトなので、コンストラクタでインラインで作業するソリューションが必要になる可能性がありますが、最終的には削除し、空のコンストラクタを追加し、アノテーションをフィールドレベルに配置し、ジャクソンがフィールドに直接設定できる場合は、セッターを無効にしますか?

答えて

1

@JsonCreator@JsonPropertyアノテーションとカスタムコンストラクタを使用してこれにアプローチできます。私はちょうどsort配列であなたの例を簡素化ようclass EnrichedStatusに見えるのか分からないので:

import java.io.IOException; 
import com.fasterxml.jackson.annotation.JsonCreator; 
import com.fasterxml.jackson.annotation.JsonProperty; 
import com.fasterxml.jackson.databind.ObjectMapper; 
import lombok.Data; 

@Data 
class TweetHit { 
    private final Long sortValue; 
    private final String uid; 

    @JsonCreator 
    public TweetHit(@JsonProperty("sort") String[] sort) { 
     this.sortValue = Long.parseLong(sort[0]); 
     this.uid = sort[1]; 
    } 
} 

public class StackOverflow { 
    public static void main(String[] args) throws IOException { 
     String json = "{ \"sort\": [\n" + 
       "  1486549042000,\n" + 
       "  \"tweet#AVodOsgk0etILSbJamY-\"\n" + 
       " ]\n" + 
       " }"; 

     ObjectMapper objectMapper = new ObjectMapper(); 
     TweetHit tweetHit = objectMapper.readValue(json, TweetHit.class); 
    } 
} 

これはTweetHitクラスの不変性を維持し、カスタムデシリアライザを回避することができます。

別の目的を果たす@JsonFormat(shape = ARRAY)でこれを行う方法がわかりません。たとえそれが可能だったとしても、配列をとり、その内容をフィールドに割り当てるコンストラクタよりも単純であるとは思えません。

@JsonCreator@JsonProperty注釈も避けたい場合は、this answerもチェックしてください。

+0

うわー、私はそれを見ていないと信じられない。私は2つのフィールド、2つのパラメータを持ってトンネルを見ている。これはうまくいった。ありがとう! – Brooks

関連する問題