【问题标题】:Jackson with JSON : receiving "null" object杰克逊与 JSON:接收“空”对象
【发布时间】:2017-01-11 19:13:54
【问题描述】:

我需要将优步产品 JSON 响应从 here 转换为 Java 对象。我正在使用杰克逊进行 JSON 处理。我的输入 JSON 如下所示:

    {
      "products": [
        {
           "capacity": 2,
           "description": "Ride for less with uberPOOL",
           "price_details": {},
           "image": "http://d1a3f4spazzrp4.cloudfront.net/car.jpg",
           "display_name": "POOL",
           "product_id": "26546650-e557-4a7b-86e7-6a3942445247",
           "shared": true,
        },
        {
           "capacity": 4,
           "description": "The low-cost Uber",
           "price_details": {
              "distance_unit": "mile",
              "cost_per_minute": 0.26,
              "service_fees": [
                 {
                    "fee": 1.0,
                    "name": "Safe Rides Fee"
                 }
              ],
              "minimum": 5.0,
              "cost_per_distance": 1.3,
              "base": 2.2,
              "cancellation_fee": 5.0,
              "currency_code": "USD"
           },
           "cash_enabled": false,
           "image": "http://d1a3f4spazzrp4.cloudfront.net/car.jpg",
           "display_name": "uberX",
           "product_id": "a1111c8c-c720-46c3-8534-2fcdd730040d",
           "shared": false
        }
      ]
    }

我的实体类看起来像:

    public class Products {

        @JsonProperty
        private int capacity;
        @JsonProperty
        private String description;
        @JsonProperty
        private String price_details;
        @JsonProperty
        private String image; 
        @JsonProperty
        private Boolean cash_enabled; 
        @JsonProperty
        private Boolean shared; 
        @JsonProperty
        private String short_description; 
        @JsonProperty
        private String display_name;

            //getter, setter methods
    } 

包装类看起来像:

    public class ProductsModel{
        private List <Products> product;

        public List<Products> getProduct() {
            return product;
        }
        public void setProduct(List<Products> product) {
            this.product = product;
        }
    }

现在,当我尝试将 JSON 映射到我的 wapper 类并尝试打印产品时......它给出了“null”,不确定为什么......请帮忙指出原因。

    private ObjectMapper mapper = new ObjectMapper();
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    productsModel = mapper.readValue(line1, ProductsModel.class);   
    response.getWriter().println("get products:" + productsModel.getProduct()); //<-- returns null - not sure why

【问题讨论】:

    标签: java json jackson uber-api


    【解决方案1】:

    使用下面的 Product 和 ProductsModel 类就可以了。

    产品条目:

    public class Products {
    
        @JsonProperty
        private int capacity;
    
        @JsonProperty
        private String description;
    
        @JsonProperty
        private Map price_details;
    
        @JsonProperty
        private String image;
    
        @JsonProperty
        private Boolean cash_enabled;
    
        @JsonProperty
        private Boolean shared;
    
        @JsonProperty
        private String short_description;
    
        @JsonProperty
        private String display_name;
    }
    

    ProductsModel 包装类:

    public class ProductsModel {
    
        private List<Products> products;
    
        public List<Products> getProducts() {
            return products;
        }
    
        public void setProducts(List<Products> products) {
            this.products = products;
        }
    }
    

    在您的代码中有两个错误:

    1. json 中的 price_details 值是一个对象而不是字符串,因此它应该是一个 Map 或一些包含内部可用属性的 PriceDetails 实体类price_details json。在我的回复中,我只是使用了 Map。
    2. ProductsModel包装类中的键名是product,应该是products

    我刚刚对 Product 和 ProductsModel 类进行了更改,并且效果很好。

    【讨论】:

    • 谢谢 Hokam.... 我按照您的建议进行了更改,但是当我尝试打印产品时.. .. 我仍然得到 NULL。
    • 实际上,我收到 InvalidFormatException ...... [INFO] com.fasterxml.jackson.databind.exc.InvalidFormatException:无法构造 java.lang 的实例。来自字符串值“uberX”的布尔值:仅识别“true”或“false”
    • 您是否使用了与上面共享的 JSON 不同的 JSON?我试过上面的那个,它工作正常。如果 JSON 不同,请共享它。
    • 是的,JSON 是一样的,但是,它一直给我与“short_description”相关的错误.. 所以最后继续前进,我正在做注释 JsonIgnore 而不是 JsonProperty
    猜你喜欢
    • 2022-06-22
    • 1970-01-01
    • 2014-03-05
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-05
    相关资源
    最近更新 更多