具有特定解串器playframework 2.8的杰克逊解串

问题描述 投票:1回答:1

[enter image description here我有一个特定的json来自prestashop webservoice,但我无法使用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;
    }



    }

不调用反序列化器,我尝试将Associations对象与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>>(){});
    }

}

enter image description here

enter image description here

java json playframework-2.0 json-deserialization jackson2
1个回答
1
投票

在json中,没有名称为products的属性。您应该在@JsonProperty("associations")products属性中添加Order,例如:

@JsonDeserialize(using = ProductDeserializer.class)
@JsonProperty("associations")
private List<Product> products;

然后更新ProductDeserializer以遍历order_rows而不是associations

return Json.mapper().readValue(node.get("order_rows").traverse(), new TypeReference<List<Product>>(){});

编辑:添加我的整个代码。我只使用杰克逊,而不使用杰克逊的游戏框架。

主类:

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

}

ProductDeserializer:

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

}
© www.soinside.com 2019 - 2024. All rights reserved.