JSON多态反序列化java

JSON多态反序列化java,java,json,Java,Json,我有一个JSON格式的文件系统结构,如下所示: { "name": "rootf", "type": "system", "path": "Parsing/rootf", "children": [{ "name": "f1", "type": "folder", "path": "Parsing/rootf/f1", "children": [{ "name": "subf1

我有一个JSON格式的文件系统结构,如下所示:

{
    "name": "rootf",
    "type": "system",
    "path": "Parsing/rootf",
    "children": [{
        "name": "f1",
        "type": "folder",
        "path": "Parsing/rootf/f1",
        "children": [{
            "name": "subf1",
            "type": "folder",
            "path": "Parsing/rootf/f1/subf1",
            "children": [{
                "name": "text1.txt",
                "type": "file",
                "path": "Parsing/rootf/folder1/subf1/text1.txt",
                "children": ["a", "b", "c"]
            }]
        }, {
            "name": "subf2",
            "type": "folder",
            "path": "Parsing/rootf/f1/subf2",
            "children": []
        }, {
            "name": "text2.txt",
            "type": "file",
            "path": "TParsing/rootf/f1/text2.txt",
            "children": ["d", "e", "f"]
        }]
    }, {
        "name": "text1.txt",
        "type": "file",
        "path": "Parsing/rootd/text1.txt",
        "children": ["aa", "bb"]
    }],
    "_id": "5ce47292d866fc2f40037a56"
}
可以看出,类型为
系统
(表示根文件夹)和类型为
文件夹
(表示根文件夹的子文件夹)的子文件夹可以包含其他文件夹和/或文件。file类型的子项包含该文件的内容。 我有一个抽象类
组件

public abstract class Component implements IComponent{

    private String name;
    private String type;
    private String path;
    public abstract <T extends IComponent> ISystem<T> getSystem();

}
我有3个具体类,它们扩展了两个抽象类:

public class System extends SystemAdapter{
    public transient Set<ComponentWrapper> components;
    private List<????> children;
    private String name;
    private String id;
    private String type;
    private String path;
公共类系统扩展SystemAdapter{
公共瞬态集组件;
私人名单儿童;
私有字符串名称;
私有字符串id;
私有字符串类型;
私有字符串路径;
public类文件夹扩展组件{
public List children=new ArrayList();
私有字符串名称;
私有字符串类型;
私有字符串路径;
公共类文件扩展组件{
public List children=new ArrayList();
私有字符串名称;
私有字符串类型;
私有字符串路径;
我一直在努力将我拥有的JSON映射到这三个类。因为
子类
可以是
文件夹
文件
类型,我如何映射? 我的目标是将
系统
类型(即根文件夹)映射到
系统.java
文件夹
类型映射到
文件夹.java
,并将JSON中的
文件
类型映射到
文件.java

第二部分是能够获取特定系统的
组件
,对于特定的
系统
获取一组所有
组件
(即,对于特定的根文件夹,获取其所有文件和子文件夹)


我看到了一些关于JSON多态反序列化的问题,但我不确定这是否适合这里。任何指导都会非常有用。

取决于您使用的JSON引擎,但是使用Jackson,您可以在父类上指定JsonTypeInfo注释


这取决于您在Java中使用的库,但如果您使用的是
Jackson
,则可以使用其中的
类型值对抽象类
组件进行反序列化

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME,property=“type”)
@JsonSubTypes({
@JsonSubTypes.Type(值=Folder.class,name=“Folder”)
@JsonSubTypes.Type(value=File.class,name=“File”)
})
公共抽象类组件实现IComponent{
//...
}

这基本上会告诉Jackson在
type
字段中读取
Folder
时插入一个
文件夹
,对于
file
字段也是如此。

作为
系统
文件
文件夹
组件
所有类都具有相同的属性

private String name;
private String type;
private String path;
您可以在
组件
中保护这些字段,以便所有
系统
文件
文件夹
都可以继承它们。由于系统类有一个额外的id字段,您只能在
系统
类中添加
id

最后,您的课程可能会喜欢以下内容:

public abstract class Component implements IComponent{

    protected String name;
    protected String type;
    protected String path;
    public abstract <T extends IComponent> ISystem<T> getSystem();
    ....
公共抽象类组件实现IComponent{
受保护的字符串名称;
保护字符串类型;
受保护的字符串路径;
公共摘要IsSystem getSystem();
....

公共类子类扩展组件{
public List children=new ArrayList();
...

公共类系统扩展子类实现SystemAdapter{
公共瞬态集组件;
私有字符串id;
....


那么如何从我的主类进行映射呢?目前我正在使用GSON,并以
JSONObject jsonResponse=client.getData(GET_URL1)的形式获取数据
从数据库中。但是如果这样做的话,我可以转移到Jackson。我应该使用ObjectMapper映射吗?是的,Jackson要将
字符串
值映射到对象的对象是
ObjectMapper
。它会自行检查类上的注释。
ObjectMapper.readValue(“json”,Component.class)
我应该在我的
子类
中放些什么?这就像将
文件
文件夹
类组合成一个
子类
类一样吗?是的..孩子类拥有文件和文件夹类所拥有的所有属性。很抱歉,文件夹可以有文件夹列表,我理解
公共列表ldren=new ArrayList();
这一行。但对于文件,它有一个
公共列表
。这一行是如何处理的?
public class File extends Component{

    public List<String> children = new ArrayList<>();
    private String name;
    private String type;
    private String path;
private String name;
private String type;
private String path;
public abstract class Component implements IComponent{

    protected String name;
    protected String type;
    protected String path;
    public abstract <T extends IComponent> ISystem<T> getSystem();
    ....
public class Children extends Component{
    public List<Children> children = new ArrayList<>();
    ...
public class System extends Children implements SystemAdapter{
    public transient Set<ComponentWrapper> components;
    private String id;
    ....