使用MyBatis在JavaRESTWeb服务中将数据从数据库映射到JSON

使用MyBatis在JavaRESTWeb服务中将数据从数据库映射到JSON,java,json,rest,mybatis,spring-mybatis,Java,Json,Rest,Mybatis,Spring Mybatis,从数据库获取数据后,我必须返回一个JSON格式的对象。 示例数据库如下所示: 我希望JSON返回值为: { "Name": "Mark", "Address": { "Adr1": "123 Avenue", "Adr2": "Apt-121", "City": "Phoenix", "State": "AZ" } } 到目前为止,我已经能够获取整个地址文本作为字符串,这对

从数据库获取数据后,我必须返回一个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创建一个单独的类,但无法映射address的各个参数(Adr1、Adr2、City、State),以便创建所需的JSON对象


有人能帮我将正确的数据从数据库映射到JSON吗?

我建议您将第二列解析为地址对象,然后创建一个名为COl#1的概要文件对象,以及从COl#2创建的地址对象

我原以为我可以进行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);
String addressDetail=“{\'Adr1\':\'123 Avenue\'、\'Adr2\':\'Apt-121\'、\'City\':\'Phoenix\'、\'State\':'AZ\'”;
Gson Gson=新的Gson();
AddressAddressObj=gson.fromJson(addressDetail,Address.class)//新的TypeToken(){}.getType());
系统输出打印LN(addressObj);

如果您一直使用该格式,您肯定需要处理对字符串的解析。我过去用过杰克逊,有很好的经验。我不确定它是否比另一个更好地处理您的字符串,但可能值得一看。我将尝试推送,至少将其中的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;
  }
}
//用于映射器的模型
公共类数据库配置文件{
字符串名;
字符串地址;
}
//将数据库配置文件转换为配置文件
公共类概要ResultHandler实现ResultHandler{
私有列表配置文件=新的ArrayList();
public List getProfiles(){return profiles;}
@重写公共void handleResult(结果上下文上下文){
DatabaseProfile DatabaseProfile=(DatabaseProfile)context.getResultObject();
地址=getAddress(databaseProfile.getAddress());
Profile Profile=新配置文件(databaseProfile.getName(),地址);
配置文件。添加(配置文件);
}
私有地址getAddress(字符串地址字符串){
地址=新地址();
//您是否在此处进行字符串解析并填写地址对象
//希望只是使用一些反序列化程序,但如果所有其他都失败了
//这是手动解析字符串的地方,我将保留它
//细节由你决定
回信地址;
}
}
然后将其与映射器一起使用可能会出现以下情况

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();
}
public List getProfilesFromDatabase(){
//结果句柄只是接口调用的一个参数
ProfileResultHandler resultHandler=新的ProfileResultHandler
getProfiles(resultHandler);
返回resultHandler.getProfiles();
}

我建议您改为更改表定义。@Kenney我本来会这样做的,但我不能。这是我可以使用的格式,然后您必须编写自定义代码来解析该字符串并手动设置POJO字段。我所知道的任何ORM映射工具都不知道如何在没有自定义代码的情况下进行转换。我建议您将第2列解析为address对象,然后创建一个名为COl#1的概要文件对象,以及从COl#2创建的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();
}