Java 我应该如何将请求主体映射到另一个对象,同时保持相同的子对象关系?
我有一个具有此模型类的请求主体:Java 我应该如何将请求主体映射到另一个对象,同时保持相同的子对象关系?,java,json,arraylist,depth-first-search,breadth-first-search,Java,Json,Arraylist,Depth First Search,Breadth First Search,我有一个具有此模型类的请求主体: public class IvrRequest { int age; String name; String address; List<IvrRequest> children; } 这是请求主体的一个示例。您没有指定要使用哪个库,因此我建议使用哪个库可以快速轻松地从JSON反序列化到Java模型,以及从一个POJO反序列化到另一个。如果您无法更改类别或类别属于第三方库,您可以随时使用。下面的示例演示如何: 反序
public class IvrRequest {
int age;
String name;
String address;
List<IvrRequest> children;
}
这是请求主体的一个示例。您没有指定要使用哪个库,因此我建议使用哪个库可以快速轻松地从
JSON
反序列化到Java
模型,以及从一个POJO
反序列化到另一个。如果您无法更改类别或类别属于第三方库,您可以随时使用。下面的示例演示如何:
- 反序列化
到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
}
您没有指定要使用哪个库,因此我建议使用哪个库可以快速轻松地从
JSON
反序列化到Java
模型,以及从一个POJO
反序列化到另一个。如果您无法更改类别或类别属于第三方库,您可以随时使用。下面的示例演示如何:
- 反序列化
到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
}
迭代
列表
并为每个元素创建另一个实体有什么问题?我无法更改classesIs的定义,有一种方法可以通过DFS实现这一点?您有两个POJO
类,您无法更改,您希望将相同的JSON
负载映射到其中两个,我说得对吗?是的……但是两个POJO类中的字段都不同迭代列表和为每个元素创建另一个实体有什么问题?我不能更改类的定义,有一种方法可以使用DFS实现这一点吗?您有两个POJO
类,您不能更改,并且您希望映射相同的类JSON
payload到其中两个,对吗?是的……但是两个POJO类中的字段都不同谢谢很多人……这是一个很好的方法,但我可以不用任何库,不用DFS或递归手动解析吗?@rohitsingh,当然你可以用递归手动完成,但我看不出有任何理由这样做。你能解释一下为什么你想手动操作吗?实际上我不允许使用任何外部库或方法…只是想使用一些算法这只是一个参考实际问题非常复杂,这个功能在那一个上不起作用…所以需要使用一些algorithm@rohitsingh,那么您的输入-JSON
文件是什么?或者IvrRequest
对象?“我不允许使用任何外部库”是什么意思?您只能使用内部JDK
类吗?您有允许使用的库的列表吗?我认为你应该创建一个新的问题,并链接到这个问题,并明确告诉什么是输入和输出,以及你可以使用哪些类。非常感谢各位……这是一个很好的方法,但我可以不使用任何库,不使用DFS或递归手动解析吗?@rohitsingh,当然,您可以使用递归手动执行,但我看不出有任何理由这样做。你能解释一下为什么你想手动操作吗?实际上我不允许使用任何外部库或方法…只是想使用一些算法这只是一个参考实际问题非常复杂,这个功能在那一个上不起作用…所以需要使用一些algorithm@rohitsingh,那么您的输入-JSON
文件是什么?或者IvrRequest
对象?“我不允许使用任何外部库”是什么意思?您只能使用内部JDK
类吗?您有允许使用的库的列表吗?我认为您应该创建一个新的问题,并链接到这个问题,明确告诉什么是输入和输出,以及您可以使用哪些类。
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'