java - 如何使用带有 lombok Builder 的 jackson 来反序列化 json 数组?

标签 java json jackson builder lombok

我想将一个原始的 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/

相关文章:

java - 将 Java 字符串中的 ASCII 代码替换为等效字符

java - Spring MVC 中的 jackson

java - 如何将 Jackson PrettyPrinter 格式 json 配置为 Gson

java - weblogic 上的 Jersey REST channel 返回 'null' 而不是序列化 JSON - 没有错误

java - 如何在 AWS 中创建新用户

java - 按引用还是按值变量? java

java - php以JSON形式回显多维数组

asp.net - JSON.net linq无法使用where语句选择节点

java - 如何在需要称为协方差的父类(super class)型的方法中返回子类型?

java - 如何使用 spring 依赖注入(inject)连接多个 fxml Controller ?