如何使用带有 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)
...
...