4

私は 2 つの POJO クラスを持っています: AddressInformationand 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;
}

休止状態を使用してクラスのインスタンスを永続化し、休止状態をPackageInformation使用してデータベースからコンテンツを取得し、コンテンツを JSON 形式で返そうとしています。私はフレームワークを使用していません。

    Session session = HibernateUtils.getSessionFactory().openSession();
    List<PackageInformation> packagelist = null;
    tx = session.beginTransaction();
    packagelist = session.createQuery("FROM PackageInformation").list();
    tx.commit();
    session.close();

packagelistPackageInformation のコレクションを持つ を 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しかし、JSONとdestinationAddress詳細が JSON として埋め込まれていません。代わりに、黒いフィールドが表示されました。以下の JSON のように、sourceAddressdestinationAddress詳細が欠落しています。

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

1 に答える 1

3

あなたの質問に直接答えるために、あなたのAddressInformationフィールドはであると思います(nullではなく、空のオブジェクトだけです)ので、休止状態の呼び出しにいくつかのポイントがありません。

ただし、よりシンプルで安全な別の方法ですべてのものをシリアル化することを試みることができます。あなたが使用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 を再度確認する必要があります。
于 2013-10-27T14:53:08.480 に答える