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