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'