Jackson 将数组元素反序列化为特定字段

Bro*_*oks 5 java json jackson lombok

是否有 Jackson 注释允许将数组反序列化为我的 POJO 的特定字段?我可以使用自定义解串器轻松完成此操作,但我希望在课堂上完成此操作。

例如,我有以下来自 Elasticsearch 的 JSON。

  {
    "_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-"
    ]
  }
Run Code Online (Sandbox Code Playgroud)

我的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;
    }
Run Code Online (Sandbox Code Playgroud)

我希望将数组 [0] 中的 long 和数组 [1] 中的 String 始终为“排序”的数组反序列化如下:

Long sortValue = sort[0]
String uid = sort[1]
Run Code Online (Sandbox Code Playgroud)

我发现了另一个问题,唯一的答案是自定义解串器,如果可以,我想避免使用它。 Jackson:在对象的不同属性中反序列化 JSON-Array

我想也许我可以@JsonProperty("sort")@JsonFormat(shape = ARRAY)某种方式使用,但无论如何我都看不到指定要反序列化到每个字段的特定单元格。

请注意,这是一个不可变对象,因此我可能需要解决方案与构造函数一起工作,但也许我可以删除 final,添加一个空构造函数,将注释放在字段级别并使用 Lombok 禁用 setter,如果Jackson 可以直接设置成字段吗?

Man*_*dis 2

您可以使用@JsonCreator@JsonProperty注释以及自定义构造函数来解决此问题。因为我不知道是什么class EnrichedStatus样子,所以我只用sort数组简化了您的示例:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这保留了TweetHit类的不变性并避免了自定义反序列化器。

我看不出有什么办法可以@JsonFormat(shape = ARRAY)达到不同目的。即使有可能,我怀疑它会比采用数组并将其内容分配给字段的构造函数更简单。

如果您也想避免,注释,另请检查此答案@JsonCreator@JsonProperty


归档时间:

查看次数:

1928 次

最近记录:

9 年,3 月 前