我应该如何在保持相同的子关系的同时将我的请求主体映射到另一个对象?

How should i map my request body to another object while maintaining the same children relationship?

我有一个这个模型的请求正文class:

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

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

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 which allows fast and easy deserialising from JSON to Java model and from one POJO to other. If you can not change class or class belongs to 3-rd party library you can always use MixIn feature。下面的例子展示了如何:

  • 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'