从Magento JSON设计Java对象

时间:2015-04-21 14:34:26

标签: java json magento gson

以下是从Magento REST API调用返回的原始JSON字符串:

{  
   "1":{  
      "entity_id":"1",
      "website_id":"1",
      "email":"john.oliver@hbo.com",
      "group_id":"1",
      "created_at":"2015-04-21 12:47:00",
      "disable_auto_group_change":"0",
      "prefix":null,
      "firstname":"John",
      "middlename":null,
      "lastname":"Oliver",
      "suffix":null,
      "taxvat":null,
      "created_in":"Admin"
   },
   "2":{  
      "entity_id":"2",
      "website_id":"1",
      "email":"beck.johnson@yahoo.com",
      "group_id":"1",
      "created_at":"2015-04-21 13:40:48",
      "disable_auto_group_change":"0",
      "prefix":null,
      "firstname":"Beckie",
      "middlename":null,
      "lastname":"Johnson",
      "suffix":null,
      "taxvat":null,
      "created_in":"Admin"
   }
}

我想第一次构建POJO,这里是类:

public class Customers {

    private Map<String, Customer> customerMap;

    public Map<String, Customer> getCustomerMap() {
        return customerMap;
    }

    public void setCustomerMap(Map<String, Customer> customerMap) {
        this.customerMap = customerMap;
    }
}

public class Customer {
    private String entity_id;
    private String website_id;
    private String email;
    private String group_id;
    private String created_at;
    private String disable_auto_group_change;
    private String prefix;
    private String firstname;
    private String middlename;
    private String lastname;
    private String suffix;
    private String taxvat;
    private String created_in;
    public String getEntity_id() {
        return entity_id;
    }
    public void setEntity_id(String entity_id) {
        this.entity_id = entity_id;
    }
    public String getWebsite_id() {
        return website_id;
    }
    public void setWebsite_id(String website_id) {
        this.website_id = website_id;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getGroup_id() {
        return group_id;
    }
    public void setGroup_id(String group_id) {
        this.group_id = group_id;
    }
    public String getCreated_at() {
        return created_at;
    }
    public void setCreated_at(String created_at) {
        this.created_at = created_at;
    }
    public String getDisable_auto_group_change() {
        return disable_auto_group_change;
    }
    public void setDisable_auto_group_change(String disable_auto_group_change) {
        this.disable_auto_group_change = disable_auto_group_change;
    }
    public String getPrefix() {
        return prefix;
    }
    public void setPrefix(String prefix) {
        this.prefix = prefix;
    }
    public String getFirstname() {
        return firstname;
    }
    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }
    public String getMiddlename() {
        return middlename;
    }
    public void setMiddlename(String middlename) {
        this.middlename = middlename;
    }
    public String getLastname() {
        return lastname;
    }
    public void setLastname(String lastname) {
        this.lastname = lastname;
    }
    public String getSuffix() {
        return suffix;
    }
    public void setSuffix(String suffix) {
        this.suffix = suffix;
    }
    public String getTaxvat() {
        return taxvat;
    }
    public void setTaxvat(String taxvat) {
        this.taxvat = taxvat;
    }
    public String getCreated_in() {
        return created_in;
    }
    public void setCreated_in(String created_in) {
        this.created_in = created_in;
    }

}

然后,我尝试使用Gson进行解析:

Gson gson = new Gson();
Customers customers = gson.fromJson(response.getBody(), Customers.class);
System.out.println(customers.getCustomerMap());

但结果是null

我怀疑类格式可能有误,有人可以建议什么是正确的格式吗?每组开头的数字12由Magento自动生成。

1 个答案:

答案 0 :(得分:1)

默认情况下这不起作用,因为Gson希望有一个名为"customerMap"的字段,以便使用默认的反序列化。最简单的( NOT NECESSARILY BEST )解决方案就是简单地执行此操作:

String jsonText = "{\"customerMap\":"+response.getBody()+"}";
Customers customers = gson.fromJson(jsonText, Customers.class);

通过在映射外部添加字段名称,Gson知道该怎么做,println将输出,例如:

{1=Customer@2f56a6be, 2=Customer@61dd1c39}

但是,最好写一个custom deserializer for your Customers class,或者修改Magneto的输出以添加周围的{"customerMap":}


请勿尝试执行此操作

Map<String, Customer> cust = gson.fromJson(jsonText, Map.class); 

这将实际生成Map类型Map<String, LinkedTreeMap>,其中LinkedTreeMap是内部gson类。