0

データベースからデータを取得した後、JSON 形式のオブジェクトを返す必要があります。サンプル データベースは次のとおりです。

ここに画像の説明を入力

JSON の戻り値を次のようにしたい:

{
"Name": "Mark",
"Address": {
            "Adr1": "123 Avenue",
            "Adr2": "Apt-121",
            "City": "Phoenix",
            "State": "AZ"
           } 
}

これまでのところ、アドレス テキスト全体を文字列として取得できましたが、これは役に立ちません。次のようになります。

{
"Name": "Mark",
"Address": "{Adr1:123 Avenue, Adr2:Apt-121, City:Phoenix, State:AZ}" 
}

私の POJO は次のようになります。

class Profile{
     String name;
     Address addr;
}

class Address{
     String Adr1;
     String Adr2;
     String City;
     String State;
}

アドレス用に別のクラスを作成しようとしましたが、必要な JSON オブジェクトを作成するために、Address(Adr1、Adr2、City、State) の個々のパラメーターをマップできません。

データベースから JSON への正しいデータのマッピングを手伝ってくれる人はいますか?

4

2 に答える 2

1

その形式に固執している場合は、文字列の解析に対処する必要があります。私は過去に非常に良い経験でジャクソンを使用しました。あなたの文字列を別の文字列よりもうまく処理できるかどうかはわかりませんが、検討する価値があるかもしれません. 値が適切に引用されるように、少なくともフォーマットされた JSON 文字列を取得するためにプッシュしようとします。それはあなたが勝つことができるはずの戦争での戦いです!.

より適切な形式の文字列で文字列を処理するかどうかにかかわらず、結果ハンドラーを使用してクラスにマップすることをお勧めします。これにより、少なくとも動作を分離し、期待どおりの単体テストを行うことができます。その内部では、住所データの解析を処理し、必要な形式に一致するオブジェクトのリストにすべてをマップできます。

例:

//model for using with mapper
public class DatabaseProfile {
    String name;
    String address;
}

//converts database profile to Profile
public class ProfileResultHandler implements ResultHandler {
  private List<AdStrategyTargetDTO> profiles = new ArrayList<>();

  public List<Profile> getProfiles() { return profiles; }

  @Override public void handleResult(ResultContext context) {
    DatabaseProfile databaseProfile = (DatabaseProfile)context.getResultObject();

    Address address = getAddress(databaseProfile.getAddress());
    Profile profile = new Profile(databaseProfile.getName(),address);

    profiles.add(profile);
  }

  private Address getAddress(String addressString){
      Address address = new Address();
      //do you string parsing here and fill in address object 
      //hopefully just using some deserializer but if all else fails 
      //this is where you would manually parse the string, I'll leave that 
      //detail up to you
      return address;
  }
}

これをマッパーで使用すると、次のようになります。

public List<Profile> getProfilesFromDatabase(){
   //the result handle just becomes a parameter of the interfaced call
   ProfileResultHandler resultHandler = new ProfileResultHandler
   profileMapper.getProfiles(resultHandler);

   return resultHandler.getProfiles();
}
于 2015-11-19T15:46:31.353 に答える
1

2 番目の列をアドレス オブジェクトとして解析し、名前、つまり COl #1 と列 #2 から作成されたアドレス オブジェクトを使用してプロファイル オブジェクトを作成することをお勧めします。

    String name = "Mark";
    String addressDetail = "{Adr1:123 Avenue, Adr2:Apt-121, City:Phoenix, State:AZ}";

    addressDetail = addressDetail.replace('{',' ');
    addressDetail = addressDetail.replace('{',' ');

    String[] addressDetailElems = addressDetail.split(",");

    for(String elem : addressDetailElems) {
        System.out.println(elem);
        String[] valX = addressDetail.split(":");
        System.out.println(valX[0] + " -- " + valX[1]);
    }

私はjsonの解析ができると思っていましたが、明らかに失敗しました。値が引用されていないため

json テキストが次のようなものであれば、解析は機能していたでしょう

String addressDetail = "{\"Adr1\":\"123 Avenue\", \"Adr2\":\"Apt-121\", \"City\":\"Phoenix\", \"State\":\"AZ\"}";

    Gson gson = new Gson();
    Address addressObj = gson.fromJson(addressDetail, Address.class);//new TypeToken<List<Address>>() {}.getType());
    System.out.println(addressObj);
于 2015-11-18T19:27:05.073 に答える