java - 杰克逊反序列化与特定的反序列化播放框架 2.8
问题描述
我有一个来自 prestashop webservoice 的特定 json,但我无法使用 playframework 2.8 正确反序列化
{
"orders": [
{
"id": 44,
"id_address_delivery": "95",
"id_address_invoice": "95",
"id_cart": "121",
"id_currency": "2",
"id_lang": "2",
"id_customer": "61",
"id_carrier": "19",
"current_state": "5",
"module": "stripe_official",
"invoice_number": "0",
"invoice_date": "0000-00-00 00:00:00",
"delivery_number": "41",
"delivery_date": "2020-01-19 23:16:05",
"valid": "1",
"date_add": "2020-01-19 18:38:10",
"date_upd": "2020-01-19 23:16:06",
"shipping_number": "",
"id_shop_group": "1",
"id_shop": "1",
"secure_key": "23e5bfbd764ab60bd23aa1c7d70e8e4e",
"payment": "Paiement par Stripe",
"recyclable": "0",
"gift": "0",
"gift_message": "",
"mobile_theme": "0",
"total_discounts": "0.000000",
"total_discounts_tax_incl": "0.000000",
"total_discounts_tax_excl": "0.000000",
"total_paid": "28.000000",
"total_paid_tax_incl": "28.000000",
"total_paid_tax_excl": "28.000000",
"total_paid_real": "28.000000",
"total_products": "28.000000",
"total_products_wt": "28.000000",
"total_shipping": "0.000000",
"total_shipping_tax_incl": "0.000000",
"total_shipping_tax_excl": "0.000000",
"carrier_tax_rate": "0.000",
"total_wrapping": "0.000000",
"total_wrapping_tax_incl": "0.000000",
"total_wrapping_tax_excl": "0.000000",
"round_mode": "2",
"round_type": "2",
"conversion_rate": "1.000000",
"reference": "JRRCSMHKI",
"associations": {
"order_rows": [
{
"id": "133",
"product_id": "45",
"product_attribute_id": "0",
"product_quantity": "1",
"product_name": "Kebab - Sandwich ou Menu: Sandwich seul; - Sauce: Biggy burger; - Crudités: Salade; Maïs",
"product_reference": "",
"product_ean13": "",
"product_isbn": "",
"product_upc": "",
"product_price": "5.500000",
"id_customization": "0",
"unit_price_tax_incl": "5.500000",
"unit_price_tax_excl": "5.500000"
}
]
}
}
]
}
问题出在关联对象上,我真的不明白,因为最后我只想要一个订单列表,每个订单中都有一个产品列表...我设法以这种方式获取订单列表,但后来我无法管理我从这个开始但产品无法反序列化
List<Order> orders= Json.mapper().readValue(json.get("orders").traverse(), new TypeReference<List<Order>>(){});
我的课就是这样
package models;
import java.util.Date;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import utils.ProductDeserializer;
@JsonIgnoreProperties(ignoreUnknown = true)
public class Order {
private Long id;
private State state;
private String payment;
@JsonProperty(value="delivery_date")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy HH:mm:ss")
private Date deliveryDate;
@JsonProperty(value="total_paid_tax_incl")
private float totalPaid;
@JsonDeserialize(using=ProductDeserializer.class)
private List<Product> products;
public float getTotalPaid() {
return totalPaid;
}
public void setTotalPaid(float totalPaid) {
this.totalPaid = totalPaid;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
public String getPayment() {
return payment;
}
public void setPayment(String payment) {
this.payment = payment;
}
public Date getDeliveryDate() {
return deliveryDate;
}
public void setDeliveryDate(Date deliveryDate) {
this.deliveryDate = deliveryDate;
}
public List<Product> getProducts() {
return products;
}
public void setProducts(List<Product> products) {
this.products = products;
}
}
不调用反序列化器,我尝试将关联对象与 OrderRaws 然后产品一起使用,但它是无用的类,我想要一些简单而高效的东西。任何想法 ?
package utils;
import java.io.IOException;
import java.util.List;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import models.Product;
import play.libs.Json;
public class ProductDeserializer extends StdDeserializer<List<Product>>{
/**
*
*/
private static final long serialVersionUID = 1L;
public ProductDeserializer() {
this(null);
}
public ProductDeserializer(Class<?> vc) {
super(vc);
}
@Override
public List<Product> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
JsonNode node = p.getCodec().readTree(p);
return Json.mapper().readValue(node.get("associations").get("order_rows").traverse(), new TypeReference<List<Product>>(){});
}
}
解决方案
在 json 中,没有 name 属性products
。您应该添加@JsonProperty("associations")
到products
属性 in Order
,例如:
@JsonDeserialize(using = ProductDeserializer.class)
@JsonProperty("associations")
private List<Product> products;
然后更新ProductDeserializer
为 traverseorder_rows
而不是associations
.
return Json.mapper().readValue(node.get("order_rows").traverse(), new TypeReference<List<Product>>(){});
编辑:添加我的整个代码。我只使用 Jackson 而不是 Jackson 和 play framework。
主类:
import java.util.List;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
public class SoMain {
private static final String jsonStr = "Your json";
public static void main(String[] args) {
ObjectMapper objectMapper = new ObjectMapper();
try {
JsonNode parentNode = objectMapper.readTree(jsonStr);
List<Order> orders = objectMapper.convertValue(parentNode.get("orders"), new TypeReference<List<Order>>() {});
System.out.println(orders);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
}
产品:
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
@JsonIgnoreProperties(ignoreUnknown = true)
public class Product {
private int id;
@JsonProperty("product_name")
private String productName;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
}
产品反序列化器:
import java.io.IOException;
import java.util.List;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
public class ProductDeserializer extends StdDeserializer<List<Product>> {
/**
*
*/
private static final long serialVersionUID = 1L;
public ProductDeserializer() {
this(null);
}
public ProductDeserializer(Class<?> vc) {
super(vc);
}
@Override
public List<Product> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
JsonNode node = p.getCodec().readTree(p);
return new ObjectMapper().convertValue(node.get("order_rows"), new TypeReference<List<Product>>() {});
}
}
命令:
import java.util.Date;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
@JsonIgnoreProperties(ignoreUnknown = true)
public class Order {
private Long id;
private String payment;
@JsonProperty(value = "delivery_date")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy HH:mm:ss")
private Date deliveryDate;
@JsonProperty(value = "total_paid_tax_incl")
private float totalPaid;
@JsonDeserialize(using = ProductDeserializer.class)
@JsonProperty("associations")
private List<Product> products;
public float getTotalPaid() {
return totalPaid;
}
public void setTotalPaid(float totalPaid) {
this.totalPaid = totalPaid;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getPayment() {
return payment;
}
public void setPayment(String payment) {
this.payment = payment;
}
public Date getDeliveryDate() {
return deliveryDate;
}
public void setDeliveryDate(Date deliveryDate) {
this.deliveryDate = deliveryDate;
}
public List<Product> getProducts() {
return products;
}
public void setProducts(List<Product> products) {
this.products = products;
}
}
推荐阅读
- java - 多个 MQTT 客户端订阅同一个主题
- php - 如果结果存在,如何搜索 PHP 数组并创建唯一变量?
- java - 我无法通过 JFileChooser 加载图表并实际显示它
- python - 以 5000 个字符的限制拆分文本文件
- firebase-authentication - 是否可以同时使用电话注册用户并链接电子邮件帐户?
- flutter - Flutter API 响应未存储,显示之前的值
- javascript - HTML datalist 从列表中隐藏选项
- php - 保护页面仅对在 WooCommerce 中购买特定产品的人可用
- maven - Dspace 安装问题
- android - Android AlertDialog 按钮:文本颜色错误