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