如何使用jackson与lombok Builder反序列化json数组?

时间:2018-02-22 13:45:38

标签: java json jackson builder lombok

我想将原始json数组反序列化为Object。 该对象使用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;
//    }
  }
}

我得到了这个例外

  

引起:com.fasterxml.jackson.databind.JsonMappingException:无法构造com.rwest.bitcoinchecker.Pair的实例$ PairBuilder:没有String-argument构造函数/工厂方法从String值反序列化('btcusd')< / p>

2 个答案:

答案 0 :(得分:2)

您已经使用lombok注释指定了构建器,您不必自己创建构建器类。

工作示例:。

key

配对课程:

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);
    }
}

答案 1 :(得分:0)

我不确定你在哪里尝试这样做,并建议你做错了,但是你的异常说它需要带字符串的构造函数:

@AllArgsConstructor(access = AccessLevel.PRIVATE)

当您设置对“PRIVATE”的访问权限时,它是从所有外部访问者隐藏构造函数,因此从注释“access”参数中删除