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

标签 java jackson jsonschema

假设我有以下 json:

{
    "empName": "rameshp",
    "designation": "SE1",
    "skills": [
        {
            "id": 2,
            "rating": 4,
            "skillName": "Node.js 7",
            "skillCategory": "Programming"
        }
    ]
}

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

{
    "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"
            }
        ]
    }
}

这个场景的整体模式应该是什么(JSON 模式)?最终,jackson 将用于为此模式生成 POJO,并用于我创建的 REST API。

编辑:(试图澄清)

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

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

最佳答案

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

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
}

转换 JSON:

现在,在将 JSON 解析为这些 DTO 之后,您可以使用 Stream API 根据 empName 字段简单地将它们收集Map:

List<EmployeeDTO> jsonSchema; // parsed JSON List

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

关于java - 如何使用动态键名生成对象类型的 JSON 模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57973061/

相关文章:

java - JVM 选项 -Xms 和 -Xmx 被忽略

java - 在 java 中验证 JSON 模式

java - 使用 Jackson 序列化类时添加类型信息,以便可以使用接口(interface)类型反序列化而不使用注释?

Java Print API - 使用等宽 'Courier New' 字体错误打印空格字符

java - 从 jdbc 向 mysql 插入可选字段值

java - 使用 Jackson Object Mapper 将 Map 转换为 Java 对象非常慢

java - Java中的Json : How to extract list of subelements?

json - jackson self 引用导致循环

java - Jackson:如何生成拒绝所有其他内容的 json 模式

JSON 架构 : Conditional dependency (by value)