java - Pojo 转 Json,如果 Pojo 有内嵌对象

标签 java json hibernate jakarta-ee gson

我有两个 POJO 类:AddressInformationPackageInformation(它们的 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();

但我没有得到带有 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,
  }
 ] 

最佳答案

为了直接回答您的问题,我认为您的 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 点。

关于java - Pojo 转 Json,如果 Pojo 有内嵌对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19615935/

相关文章:

javascript - Gallery3 - 保存失败后重新加载页面

mysql - 我如何操作嵌套查询 j2ee hibernate

Spring boot 1.4.2.RELEASE 启动时出错 java.lang.ClassNotFoundException : org. springframework.beans.factory.ObjectProvider

java - doInBackground 不起作用

java - 如何根据第一个微调器中所做的选择从数据库中过滤第二个微调器值?

java - 如何在条形图 javafx 顶部显示条形图值

asp.net - 为什么 Time.strptime() 返回当前日期?

java - 应用隐藏时如何发送和接收数据?

java - 将 UTC 日期四舍五入到最接近的 5 分钟

java - Java 中的可排序 HTML 表格