多个JSON格式到一个对象

时间:2018-01-04 12:03:19

标签: java json spring jackson dozer

我有解析器来解析多个网站并提取所需的数据,并为每个网站生成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。重构和开发这个大工作空间并不容易,而且不是很好!!!

1 个答案:

答案 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结构,但将这些值映射到名为urltitleowner的字段。对于站点1,您将创建另一个MyModel的子类,并将创建不同类型的构造函数映射。

如果您使用更高级的杰克逊注释,例如@JsonTypeInfo等,并且您将“url”值设为类型决定属性 1),您甚至可以使整个过程工作在你将不同类型的JSON文档推送到Jackson的意义上,它会自动地知道哪个子类用于反序列化过程。我不会详细介绍这个,但Baeldung has a good resource on Jackson annotations

1) 编辑:好的,我看到你添加了“网站3”示例,其中没有“网址”值......但是这个答案的第一部分仍然站着。既然您必须知道JSON文档来自哪里的网站,也许您可​​以对它们进行预处理并为每个文档添加一个新的键值对,例如"site": "Site1",并将其用作Jackson子类型标识符?