我想将一个原始的 json 数组反序列化为一个对象。 该对象使用 lombok 的值和构建器注释进行注释。 我无法让它工作:
json 看起来像这样:
["btcusd","ltcusd","ltcbtc"]
这是获取一些 json 数组的调用:
public CommandLineRunner run(RestTemplate restTemplate) {
return args -> {
Pair[] pairs = restTemplate
.getForObject("https://api.bitfinex.com/v1/symbols", Pair[].class);
log.info("List[" + Arrays.stream(pairs).map(Pair::getPairId).collect(
Collectors.joining(", ")) + "]");
};
}
这是 Pair.class
@Value
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@JsonDeserialize(builder = Pair.PairBuilder.class)
public class Pair {
@NonNull private String pairId;
private String left;
private String right;
@Builder
private Pair(String pairId) {
this.pairId = pairId;
left = pairId.substring(0, 3).toUpperCase(Locale.US);
right = pairId.substring(3).toUpperCase(Locale.US);
}
@JsonPOJOBuilder(withPrefix = "")
public static final class PairBuilder {
// @JsonCreator
// public PairBuilder pairID(@NonNull String pairId) {
// this.pairId = pairId;
// return this;
// }
}
}
我得到这个异常
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of com.rwest.bitcoinchecker.Pair$PairBuilder: no String-argument constructor/factory method to deserialize from String value ('btcusd')
最佳答案
你已经用lombok注解指定了构建器,你不必自己创建构建器类。
工作示例:.
import org.springframework.web.client.RestTemplate;
RestTemplate restTemplate = new RestTemplate();
Pair[] pairs = restTemplate
.getForObject("https://api.bitfinex.com/v1/symbols", Pair[].class);
对类:
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.NonNull;
import lombok.Value;
import java.util.Locale;
@Value
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class Pair {
@NonNull private String pairId;
private String left;
private String right;
@Builder
private Pair(String pairId) {
this.pairId = pairId;
left = pairId.substring(0, 3).toUpperCase(Locale.US);
right = pairId.substring(3).toUpperCase(Locale.US);
}
}
结果:
Pair(pairId=btcusd, left=BTC, right=USD)
Pair(pairId=ltcusd, left=LTC, right=USD)
Pair(pairId=ltcbtc, left=LTC, right=BTC)
...
...
关于java - 如何使用带有 lombok Builder 的 jackson 来反序列化 json 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48929000/