【问题标题】:Multiple JSON format to one Object多个 JSON 格式到一个对象
【发布时间】:2018-01-04 12:03:19
【问题描述】:

我有一个解析器,可以解析多个网站并提取所需的数据,并为每个网站生成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 文件)可以大于 100100 不同的格式。如果我使用这个解决方案,我需要 100 每个站点的不同对象,然后是 100 XML DozerMapper。重构和开发这个大工作区并不容易,这也不好!!!

【问题讨论】:

    标签: java json spring jackson dozer


    【解决方案1】:

    使用 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 示例中的 JSON 结构(网址、标题和管理器),但将这些值映射到名为 urltitleowner 的字段。对于站点 1,您将创建 MyModel 的另一个子类,并创建不同类型的构造函数映射。

    如果您使用更高级的 Jackson 注释,例如 @JsonTypeInfo 等,并且您将“url”值设为您的类型决定属性1),您甚至可以让整个过程在感觉您只是将不同类型的 JSON 文档推送到 Jackson,它会自动知道要用于反序列化过程的子类。这个我就不详细说了,Baeldung has a good resource on Jackson annotations.

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-20
      • 2022-11-29
      • 2014-10-17
      • 1970-01-01
      • 2018-08-03
      相关资源
      最近更新 更多