我有两个 POJO 类:AddressInformation
和 PackageInformation
(它们的 getter 和 setter 未在下面的代码中指定)。
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 保留类的实例,并尝试使用 hibernate 从数据库中检索 PackageInformation
的内容,并将内容作为 JSON 格式返回。我没有使用任何框架。
Session session = HibernateUtils.getSessionFactory().openSession();
List<PackageInformation> packagelist = null;
tx = session.beginTransaction();
packagelist = session.createQuery("FROM PackageInformation").list();
tx.commit();
session.close();
我希望将包含 PackageInformation 集合的 packagelist
转换为 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();
但我没有得到带有 sourceAddress
和 destinationAddress
详细信息作为 JSON 嵌入的 JSON。相反,我得到了黑色字段:sourceAddress
和 destinationAddress
详细信息丢失,如下面的 JSON 所示。
[
{
"sourceAddress": {},
"destinationAddress: {},
"package_id": 1,
"package_type": 1,
"package_weight": 500,
}
{
"sourceAddress": {},
"destinationAddress: {},
"package_id": 2,
"package_type": 5,
"package_weight": 700,
}
]
最佳答案
为了直接回答您的问题,我认为您的 AddressInformation
字段是空(不为空,只是空对象),因此您在 hibernate 调用中遗漏了一些要点.
但是,您可以尝试以另一种更简单、更安全的方式序列化所有内容。您正在使用 JsonElement
和 JsonObject
,我认为它们是 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 点。
关于java - Pojo 转 Json,如果 Pojo 有内嵌对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19615935/