如何在保持相同子关系的同时将请求正文映射到另一个对象?



我有一个包含此模型类的请求正文:

public class IvrRequest {
int age;
String name;
String address;
List<IvrRequest> children;
}

我想将其映射到另一个类模型,例如:

public class IvrMapper {
int id;
String name;
List<IvrMapper> resourceElements;
}

我应该使用什么方法?

例:-

{
"age":16,
"name":"Rohit",
"address":"adgsgdsdfgsdfgsf",
"children":[
{
"age":16,
"name":"Rohit",
"address":"adgsgdsdfgsdfgsf",
"children":[{
"age":16,
"name":"Rohit",
"address":"adgsgdsdfgsdfgsf"                
}]
},
{
"age":45,
"name":"Singh",
"address":"45afasdfas54df6asdf",
"children":[{
"age":55,
"name":"nitin",
"address":"@%^%@#^Ghagdhasdhg"              
}]
}]
}

这是请求正文的示例。

您没有指定使用哪个库,因此我建议使用Jackson,它允许从JSON快速轻松地反序列化到Java模型以及从一个POJO反序列化到另一个模型。如果您无法更改类或类属于3-rd party库,则始终可以使用MixIn功能。下面的示例演示如何:

  • JSON反序列化为IvrRequest
  • JSON反序列化为IvrMapper
  • IvrRequest转换为IvrMapper

简单的应用程序:

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.util.List;
public class JsonApp {
public static void main(String[] args) throws Exception {
File jsonFile = new File("./resource/test.json").getAbsoluteFile();
ObjectMapper mapper = new ObjectMapper();
mapper.addMixIn(IvrMapper.class, IvrMapperMixIn.class);
System.out.println("Parse IvrRequest model: ");
IvrRequest ivrRequest = mapper.readValue(jsonFile, IvrRequest.class);
System.out.println(ivrRequest);
System.out.println("Parse IvrMapper model: ");
System.out.println(mapper.readValue(jsonFile, IvrMapper.class));
System.out.println("Convert IvrRequest to IvrMapper");
System.out.println(mapper.convertValue(ivrRequest, IvrMapper.class));
}
}
@JsonIgnoreProperties(ignoreUnknown = true)
interface IvrMapperMixIn {
@JsonProperty("age")
int getId();
@JsonProperty("children")
List<IvrMapper> getResourceElements();
}
class IvrRequest {
private int age;
private String name;
private String address;
private List<IvrRequest> children;
// getters, setters, toString
}
class IvrMapper {
private int id;
private String name;
private List<IvrMapper> resourceElements;
// getters, setters, toString
}

以上应用打印:

Parse IvrRequest model: 
age=16, name='Rohit', address='adgsgdsdfgsdfgsf'
children=
age=16, name='Rohit', address='adgsgdsdfgsdfgsf'
children=
age=16, name='Rohit', address='adgsgdsdfgsdfgsf'
age=45, name='Singh', address='45afasdfas54df6asdf'
children=
age=55, name='nitin', address='@%^%@#^Ghagdhasdhg'

Parse IvrMapper model: 
id=16, name='Rohit'
resourceElements=
id=16, name='Rohit'
resourceElements=
id=16, name='Rohit'
id=45, name='Singh'
resourceElements=
id=55, name='nitin'

Convert IvrRequest to IvrMapper
id=16, name='Rohit'
resourceElements=
id=16, name='Rohit'
resourceElements=
id=16, name='Rohit'
id=45, name='Singh'
resourceElements=
id=55, name='nitin'

最新更新