JSON多态反序列化java
我有一个JSON格式的文件系统结构,如下所示: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
{
"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;
....