2013-10-27 107 views
4

我有两个POJO类:AddressInformationPackageInformation(它们的getter和setter在下面的代码中没有指定)。Pojo to Json,如果Pojo嵌入对象

public class AddressInformation { 
    private Integer address_id; 
    private String street_name; 
    private String city; 
    private String state; 
    private Integer zipcode; 
} 

public class PackageInformation { 

    private Integer packageId; 
    private Integer packageType; 
    private Double packageWeight; 
    private AddressInformation packageSource; 
    private AddressInformation packageDestination; 
} 

我坚持使用Hibernate的类的实例,并试图找回的PackageInformation使用Hibernate的数据库内容,并作为JSON格式返回的内容。我没有使用任何框架。我想要packagelist其中PackageInformation的集合被转换为JSON。

这里的问题是PackageInformation对象中嵌入了AddressInformation对象。

我尝试下面的代码,PackageInformation集合转换成JSON:

JSONArray json = new JSONArray(); 
    Gson gson = new Gson(); 
    try{ 
     for(PackageInformation pack : packagelist){ 

      JSONObject jsonObj = new JSONObject(); 
      AddressInformation sourceAddress = pack.getPackageSource(); 
      JsonElement sourceAddressJson = gson.toJsonTree(sourceAddress); 
      jsonObj.put("sourceAddress",sourceAddressJson); 
      AddressInformation destinationAddress = pack.getPackageDestination(); 
      JsonElement destinationeAddressJson = gson.toJsonTree(destinationAddress); 
      jsonObj.put("destinationAddress",destinationeAddressJson); 
      jsonObj.put("package_id",pack.getPackageId()); 
      jsonObj.put("package_type",pack.getPackageType()); 
      jsonObj.put("package_weight",pack.getPackageWeight()); 
     } 
     returnString = json.toString(); 
    }catch(JSONException je){ 
      returnString = je.toString(); 
    } 
    return Response.status(200).entity(returnString).build(); 

但我不sourceAddressdestinationAddress细节嵌入作为JSON得到JSON。相反,我得到了黑色字段:sourceAddressdestinationAddress细节缺失,如下面的JSON。

[ 
    { 
    "sourceAddress": {}, 
    "destinationAddress: {}, 
    "package_id": 1, 
    "package_type": 1, 
    "package_weight": 500, 
    } 
    { 
    "sourceAddress": {}, 
    "destinationAddress: {}, 
    "package_id": 2, 
    "package_type": 5, 
    "package_weight": 700, 
    } 
] 
+0

那么是什么问题? –

回答

3

要直接回答你的问题,我认为你的AddressInformation字段为空(不为空,只是空的对象),所以你缺少一些点到你的Hibernate调用。

但是,您可以尝试以另一种更简单和安全的方式序列化所有内容。您正在使用JsonElementJsonObject,我认为Gson为您提供的服务“低级”方面。

我想用我的例子来同时显示一个空对象的效果,所以在最终的JSON中将源地址与目标地址进行比较。这是我的建议。

public class PackageInformation { 

    @SerializedName("package_id") 
    Integer packageId; 

    @SerializedName("package_type") 
    Integer packageType; 

    @SerializedName("package_weight") 
    Double packageWeight; 

    @SerializedName("sourceAddress") 
    AddressInformation packageSource; 

    @SerializedName("destinationAddress") 
    AddressInformation packageDestination; 
} 

正如你可以注意到,我添加了注释@SerializedName改变序列字段的名称(这是为什么,我想,你正在使用这种方法)。然后我使用Gson为您提供的最简单的序列化方法。

public class Q19615935 { 

    public static void main(String[] args) { 
     List<PackageInformation> list = new ArrayList<PackageInformation>(); 

     PackageInformation pi = new PackageInformation(); 
     pi.packageId = 42; 
     pi.packageType = 21; 
     pi.packageWeight = 2000.0; 

     AddressInformation source = new AddressInformation(); 
     source.address_id = 1; 
     source.city="A city"; 
     source.state="A state"; 
     source.street_name="A street name"; 
     source.zipcode=0; 

     pi.packageSource= source; 
     pi.packageDestination=new AddressInformation(); 

     list.add(pi); 

     Gson g = new Gson(); 
     System.out.println(g.toJson(list)); 


    } 

} 

因为我没有你的数据库,我建通过手名单,这是我的结果(我格式化控制台结果):

[ 
    { 
     "package_id": 42, 
     "package_type": 21, 
     "package_weight": 2000, 
     "sourceAddress": { 
      "address_id": 1, 
      "street_name": "A street name", 
      "city": "A city", 
      "state": "A state", 
      "zipcode": 0 
     }, 
     "destinationAddress": { } 
    } 
] 

我的结论:

  1. 如果源和目标不是空对象,则应使用我的序列化代码。
  2. 如果它们是空的,你应该检查它们是怎么来的数据库,一旦解决了,再次检查点1