我有解析器来解析多个网站并提取所需的数据,并为每个网站生成JSON
文件。每个JSON
文件具有不同的格式,但具有相同的逻辑。
例如:
网站1 JSON
{ url:"site1.url.com",
name: "site1Name",
owner:"ownerName",
category:"book,magazine",
content:{
book:[{ name:"book1",author:"author1"},
{name:"book2",author:"author2",...],
magazine:[...]
}
}
网站2 JSON
{ url:"site2.url.com",
title: "site2Name",
manager:"ownerName2",
category:"software",
content:{
software:[{ name:"software1",author:"author1"},
{name:"software2",author:"author2",...]
}
}
网站3 JSON
{ link:"site3.url.com",
label: "site3Name",
admin:"ownerName3",
category:"software",
content:{
software:[{ title:"Firefox",type:"browser"},
{title:"InteliJ",type:"IDE",...]
}
}
现在,我想收集Java Spring-MVC
应用程序中的所有数据。然后将它们合并到我的模型中并将它们保持为数据库结构格式。请注意,我的模型和数据库结构与JSON
已解析数据不同。
我尝试了这个解决方案:
首先为每个站点(JSON
文件)创建一个JSON
对象,然后使用Jackson将JSON
反序列化为我的对象。然后使用DozerMapper
将对象映射到我的模型并将它们保存到数据库中。
有更好的解决方案吗?
注意:
JSON
个文件)可能大于100
格式100
。如果我使用此解决方案,我需要每个网站100
个不同的对象,然后100
XML
DozerMapper
。重构和开发这个大工作空间并不容易,而且不是很好!!! 答案 0 :(得分:0)
使用Jackson的JsonCreator
构造函数注释和@JsonProperty
参数注释,您可以正确地将JSON字段映射到您自己的模型字段中,因此您不需要Dozer。所以像这样:
public class MyModel {
final String url;
final String title;
final String owner;
protected MyModel(String url, String title, String owner) {
this.url = url;
this.title = title;
this.owner = owner;
}
}
public class Site2Model extends MyModel {
@JsonCreator
public Site2Model(
@JsonProperty("url") String url,
@JsonProperty("title") String title,
@JsonProperty("manager") String owner) {
super(url, title, owner);
}
}
这假定您的站点2示例(url,title和manager)中的JSON结构,但将这些值映射到名为url
,title
和owner
的字段。对于站点1,您将创建另一个MyModel
的子类,并将创建不同类型的构造函数映射。
如果您使用更高级的杰克逊注释,例如@JsonTypeInfo
等,并且您将“url”值设为类型决定属性 1),您甚至可以使整个过程工作在你将不同类型的JSON文档推送到Jackson的意义上,它会自动地知道哪个子类用于反序列化过程。我不会详细介绍这个,但Baeldung has a good resource on Jackson annotations。
1) 编辑:好的,我看到你添加了“网站3”示例,其中没有“网址”值......但是这个答案的第一部分仍然站着。既然您必须知道JSON文档来自哪里的网站,也许您可以对它们进行预处理并为每个文档添加一个新的键值对,例如"site": "Site1"
,并将其用作Jackson子类型标识符?