【问题标题】:JSON to POJO with Integer as Array attribute key NameJSON 到 POJO,整数作为数组属性键名称
【发布时间】:2017-01-17 07:05:37
【问题描述】:

我有以下 json,它有一个产品数组,其中 product_id 作为每个数组。产品 id 是数字。当我在网上寻找 pojo 课程时,我得到的课程名称以不允许的数字开头。

 {
        "_id:" : "1234AG567",
        "products" : {
            "1234":{
                "product_name" : "xyz",
                "product_type" : "abc"
            },
            "3456":{
                "product_name" : "zzz",
                "product_type" : "def"
            }
        }
    }

Below are the Pojo classes I am getting 



 public class MyPojo
{
    private Products products;

    public Products getProducts ()
    {
        return products;
    }
public void setProducts (Products products)
{
    this.products = products;
}

@Override
public String toString()
{
    return "ClassPojo [products = "+products+"]";
}

}

public class Products
{
    private 1234 1234;

    private 3456 3456;

    public 1234 get1234 ()
    {
        return 1234;
    }

    public void set1234 (1234 1234)
    {
        this.1234 = 1234;
    }

    public 3456 get3456 ()
    {
        return 3456;
    }

    public void set3456 (3456 3456)
    {
        this.3456 = 3456;
    }

    @Override
    public String toString()
    {
        return "ClassPojo [1234 = "+1234+", 3456 = "+3456+"]";
    }
}
public class 3456
{
    private String product_name;

    private String product_type;

    public String getProduct_name ()
    {
        return product_name;
    }

    public void setProduct_name (String product_name)
    {
        this.product_name = product_name;
    }

    public String getProduct_type ()
    {
        return product_type;
    }

    public void setProduct_type (String product_type)
    {
        this.product_type = product_type;
    }

    @Override
    public String toString()
    {
        return "ClassPojo [product_name = "+product_name+", product_type = "+product_type+"]";
    }
}

public class 1234
{
    private String product_name;

    private String product_type;

    public String getProduct_name ()
    {
        return product_name;
    }

    public void setProduct_name (String product_name)
    {
        this.product_name = product_name;
    }

    public String getProduct_type ()
    {
        return product_type;
    }

    public void setProduct_type (String product_type)
    {
        this.product_type = product_type;
    }

    @Override
    public String toString()
    {
        return "ClassPojo [product_name = "+product_name+", product_type = "+product_type+"]";
    }
}

我已经使用http://pojo.sodhanalibrary.com/进行转换

欢迎任何帮助如何为此 JSON 创建 pojo。提前致谢。

【问题讨论】:

    标签: java json pojo


    【解决方案1】:

    您可以使用Map 来存储products 并将其包装在另一个类中以存储整个json。例如。 Product 类看起来像这样:

    class Product {
    
        @JsonProperty("product_name")
        private String productName;
    
        @JsonProperty("product_type")
        private String productType;
    
        public String getProductName() {
            return productName;
        }
    
        public void setProductName(String productName) {
            this.productName = productName;
        }
    
        public String getProductType() {
            return productType;
        }
    
        public void setProductType(String productType) {
            this.productType = productType;
        }
    }
    

    包装类看起来像这样:

    class ProductList{
    
        @JsonProperty("_id")
        private String id;
    
        private Map<String, Product> products;
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public Map<String, Product> getProducts() {
            return products;
        }
    
        public void setProducts(Map<String, Product> products) {
            this.products = products;
        }
    }
    

    这是 Jackson 的反序列化示例:

    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        ProductList list = mapper.readValue("{\"_id\" : \"1234AG567\",\"products\" : {\"1234\":{\"product_name\" : \"xyz\",\"product_type\" : \"abc\"},\"3456\":{\"product_name\" : \"zzz\",\"product_type\" : \"def\"}}}", ProductList.class);
        System.out.println(list.getId());
        System.out.println(list.getProducts());
    }
    

    请注意,您的json 中有错字。 id 字段应该是_id 而不是_id:(如果这是实际的字段名称,那么您可以将JsonProperty 注释更改为_id:

    Here 是 Jackson 的文档。

    【讨论】:

    • 非常感谢。是的,错字应该是_id。我会尝试您的上述解决方案并让您知道。
    【解决方案2】:

    JSON 是有效的,但您将无法创建 POJO 来表示它。就像您已经看到的那样,您不能创建以数字开头的类,而且您也不想这样做,因为它们不会为您提供任何意义。

    我猜 products 是一个 Product 数组,而那个数字是一个 ID 或其他东西。 JSON 应该如下所示:

    {
        "products": [
        {
            "id": "1234",
            "product_name": "xyz",
            "product_type": "abc"
        },
        {
            "id": "3456",
            "product_name": "zzz",
            "product_type": "def"
        }]
    }
    

    这将反序列化为包含

    的类
    private List<Product> products;
    

    假设 Product 类看起来像

    class Product {
      private Integer id;
    
      @JsonProperty(value = "product_name")
      private String productName;
    
      @JsonProperty(value = "product_type")
      private String productType;
    }
    

    【讨论】:

    • 感谢@Darshan Mehta。为了答案
    猜你喜欢
    • 1970-01-01
    • 2014-01-17
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多