从数据库中获取数据后,我必须返回JSON格式的对象。
示例数据库如下:

java - 使用MyBatis在Java Rest Web Service中将数据从数据库映射到JSON-LMLPHP

我希望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?

最佳答案

如果您坚持使用该格式,则肯定需要处理该字符串。过去,我使用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();
}

07-25 22:36
查看更多