java 数组反序列化_java – 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-"

]

}

我的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;

}

我想要“sort”数组,它将始终在数组[0]中有一个long,在数组[1]中有一个String,要反序列化如下:

Long sortValue = sort[0]

String uid = sort[1]

我想也许我可以在某种程度上使用@JsonProperty(“sort”)与@JsonFormat(shape = ARRAY),但我还是没有看到指定要反序列化到每个字段的特定单元格.

注意,这是一个不可变对象,所以我可能需要解决方案与构造函数一起工作,尽管我可以删除final,添加一个空构造函数,将注释放在字段级别并使用Lombok禁用setter if杰克逊可以直接进入田野吗?

最佳答案 您可以使用@JsonCreator和@JsonProperty注释以及自定义构造函数来处理此问题.因为我不知道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);

}

}

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

我看不到用@JsonFormat(shape = ARRAY)来实现这个目的的方法.即使有可能,我怀疑它会比采用数组并将其内容分配给字段的构造函数更简单.

如果您还想避免@JsonCreator,@ JsonProperty注释,请检查this answer.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值