Как развернуть только параметр id в Json

#java #json #jackson

#java #json #джексон

Вопрос:

Предположим, у нас есть такие классы:

 public class Cart{
   private int id;
   private String cartName;
   private String color;
   @JsonIgnore
   @OneToMany(mappedBy = "cart")
   private List<Item> items;
}
  
 public class Item{
   @ManyToOne
   @JoinColumn(nullable = false)
   private Cart cart;
   private int id;
   private String itemName;
   private double weight;
}
  

Обычно, когда вы сериализуете класс элемента, вы увидите это:

 { 
   "id" : 1,
   "itemName" : "NiceItem",
   "weight" : 5.2,
   "cart" : {
      "id" : 3,
      "cartName" : "NiceCart",
      "color" : "Red"
   }
}
  

Мой вопрос в том, как я могу заставить корзину сериализоваться по ее идентификатору следующим образом:

 { 
   "id" : 1,
   "itemName" : "NiceItem",
   "weight" : 5.2,
   "cart_id" : 3
}
  

Комментарии:

1. Вероятно, вам потребуется создать новый класс товаров, который хранит корзину как int

2. @Onecricket Есть ли способ сделать это проще с помощью одной аннотации, которая уже реализована?

3. Не уверен, как аннотация поможет преобразовать объект в примитив

Ответ №1:

один из возможных способов — использовать пользовательскую сериализацию / десериализацию

 public class Cart{
   private int id;
   private String cartName;
   private String color;

}

public class Item{
   @ManyToOne
   @JoinColumn(nullable = false)
   @JsonUnwrapped
   @JsonSerialize(using = CartSerializer.class)
   @JsonDeserialize(using = CartDeserializer.class)
   @JsonProperty("cart_id")
   private Cart cart;
   private int id;
   private String itemName;
   private double weight;
}

public class CartSerializer extends StdSerializer<Cart> {

  public CartSerializer() {
    super(Cart.class);
  }

  @Override
  public void serialize(Cart value, JsonGenerator gen, SerializerProvider provider) throws IOException {
    gen.writeString(value.getCartId());
  }
}

@Component
public class CartDeserializer extends StdDeserializer<Cart> {

  @Autowired
  private CartRepository cartRepository;

  protected CartDeserializer(CartRepository cartRepository) {
    super(Cart.class);
    this.cartRepository = cartRepository;
  }

  @Override
  public Cart deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JacksonException {
    JsonNode node = p.getCodec().readTree(p);
    var cartId = node.get("cart_id").asText();

    return cartRepository.findById(cartId)
        .orElseThrow(() -> new JsonParseException(p, "cart_id does not exist"));
  }
}