如何使用带有 lombok Builder 的 jackson 来反序列化 json-array?
How to use jackson with lombok Builder to deserialize a json-array?
我想将原始 json 数组反序列化为对象。
该对象使用 lombok 的值和构建器注释进行注释。
我无法让它工作:
json 看起来像这样:
["btcusd","ltcusd","ltcbtc"]
这是获取一些 json-array:
的调用
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')
我不确定你在哪里尝试这样做并建议你做错了,但你的异常说它需要构造函数和 String:
@AllArgsConstructor(access = AccessLevel.PRIVATE)
当您设置对 "PRIVATE" 的访问时,它对所有外部访问器隐藏构造函数,因此从注释 "access" 参数中删除
您已经使用lombok注解指定了构建器,您不必自己创建构建器class。
工作示例:.
import org.springframework.web.client.RestTemplate;
RestTemplate restTemplate = new RestTemplate();
Pair[] pairs = restTemplate
.getForObject("https://api.bitfinex.com/v1/symbols", Pair[].class);
对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)
...
...
我想将原始 json 数组反序列化为对象。 该对象使用 lombok 的值和构建器注释进行注释。 我无法让它工作:
json 看起来像这样:
["btcusd","ltcusd","ltcbtc"]
这是获取一些 json-array:
的调用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')
我不确定你在哪里尝试这样做并建议你做错了,但你的异常说它需要构造函数和 String:
@AllArgsConstructor(access = AccessLevel.PRIVATE)
当您设置对 "PRIVATE" 的访问时,它对所有外部访问器隐藏构造函数,因此从注释 "access" 参数中删除
您已经使用lombok注解指定了构建器,您不必自己创建构建器class。
工作示例:.
import org.springframework.web.client.RestTemplate;
RestTemplate restTemplate = new RestTemplate();
Pair[] pairs = restTemplate
.getForObject("https://api.bitfinex.com/v1/symbols", Pair[].class);
对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)
...
...