簡體   English   中英

使用MyBatis在Java Rest Web Service中將數據從數據庫映射到JSON

[英]Mapping data from database to JSON in Java Rest Web Service using MyBatis

從數據庫中獲取數據后,我必須返回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;
}

我嘗試為地址創建一個單獨的類,但無法映射Address(Adr1,Adr2,City,State)的各個參數,以便創建所需的JSON對象。

誰能幫助我將正確的數據從數據庫映射到JSON?

我建議您將第二列解析為地址對象,然后創建一個具有Name的配置文件對象,即COl#1和從Col#2創建的Address對象

    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);

如果您堅持使用該格式,則肯定需要處理該字符串。 過去,我使用Jackson的經驗非常好。 我不確定它是否可以比其他字符串更好地處理您的字符串,但可能值得一看。 我將嘗試至少推送格式化的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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM