如何使用动态键名生成对象类型的JSON模式?

xpl*_*raj 5 java jsonschema jackson

说我有以下json:

{
    "empName": "rameshp",
    "designation": "SE1",
    "skills": [
        {
            "id": 2,
            "rating": 4,
            "skillName": "Node.js 7",
            "skillCategory": "Programming"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

现在可能有多个类似上面的对象,所以我想引用上面的模式,该模式可以从https://www.jsonschema.net生成,但是我想将empName作为对象键,并将上面的value作为值,因此它将具有多个唯一键(empName)的对象,并且该值将引用上面的架构。考虑下面的示例,当POJO通过序列化为JSON时Jackson,应如下所示:

{
    "rameshp": {
        "empName": "rameshp",
        "designation": "SE1",
        "skills": [
            {
                "id": 2,
                "rating": 4,
                "skillName": "Node.js 7",
                "skillCategory": "Programming"
            }
        ]
    },
    "john": {
        "empName": "john",
        "designation": "SE2",
        "skills": [
            {
                "id": 2,
                "rating": 4,
                "skillName": "Node.js 7",
                "skillCategory": "Programming"
            }
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

此方案的总体架构(JSON架构)应该是什么?最终,杰克逊将用于为该架构生成POJO,并在我创建的REST API中使用。

编辑:(试图澄清)

想象一个List<Map<k, v>>作为我的数据。我想要为此的json模式,其输出json将把键作为对象名称,就像上面的json示例一样。

解决方案:Mushif对这个问题的评论就是答案。对于值部分,可以使用jsonschema。Map<String, EmployeeDTO>

Mus*_*waz 0

最初,我在问题中添加了评论。事实证明这是这个问题的解决方案(如问题描述中所述)。我认为我应该进一步扩展我提出的解决方案。

DTO 类:

public class EmployeeDTO {
    String empName;
    String designation;
    List<SkillDTO> skills;
    // getter/setters here
}

public class SkillDTO {
    Integer id;
    Integer rating;
    String skillName;
    String skillCategory;
    // getter/setters here
}
Run Code Online (Sandbox Code Playgroud)

转换 JSON:

现在,将 JSON 解析为这些 DTO 后,您可以使用 Stream APIcollect将它们简单地Map基于字段:empName

List<EmployeeDTO> jsonSchema; // parsed JSON List

Map<String, EmployeeDTO> result = jsonSchema.stream().collect(Collectors.toMap(EmployeeDTO::getEmpName, Function.identity()));
Run Code Online (Sandbox Code Playgroud)