2017-01-16 1 views
0

J'ai le fichier json suivant qui a un tableau de produits avec id_produit comme chaque tableau.Les ID de produit sont des nombres. Quand je cherche en ligne pour les classes pojo, je reçois des noms de classes qui commencent par des chiffres qui ne sont pas autorisés.JSON à POJO avec la clé d'attribut Integer as Array

{ 
     "_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+"]"; 
    } 
} 

Je l'ai utilisé pour convertir le http://pojo.sodhanalibrary.com/

Toute aide à créer POJO pour cette JSON est la bienvenue. Merci d'avance.

Répondre

1

Vous pouvez utiliser Map pour stocker le products et l'envelopper dans une autre classe pour stocker le fichier entier. Par exemple. Product classe ressemblerait à ceci:

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

classe wrapper ressemblerait à ceci:

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

est Voici l'exemple de désérialisation avec 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()); 
} 

S'il vous plaît noter que votre json a une faute de frappe. champ Id devrait être _id et non _id: (si tel est le nom du champ réel alors vous pouvez changer JsonProperty annotation _id:.

Here est la documentation pour Jackson.

+0

Merci beaucoup. oui c'était typo devrait être _id. Je vais essayer votre solution ci-dessus et vous le faire savoir. – hopeIsTheonlyWeapon

0

Le JSON est valide, mais vous ne serez pas en mesure Comme vous l'avez déjà vu, vous ne pouvez pas créer des classes qui commencent par des nombres, et vous ne voulez pas le faire de toute façon, car ils ne vous donneront aucun sens

va deviner que les produits sont un tableau de Product, et que ce nombre est un identifiant ou quelque chose du genre, le JSON devrait ressembler à ceci:

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

Ce qui serait désérialiser dans une classe qui contient

private List<Product> products; 

en supposant que que la classe de produit ressemble

class Product { 
    private Integer id; 

    @JsonProperty(value = "product_name") 
    private String productName; 

    @JsonProperty(value = "product_type") 
    private String productType; 
} 
+0

Merci @Darshan Mehta. Pour la réponse – hopeIsTheonlyWeapon