2013-10-27 138 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