如何使用动态键名生成 JSON 对象类型的模式?
How to generate JSON schema of object type with dynamic key names?
假设我有以下 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>
最初,我在问题中添加了 。结果证明是这个问题的解决方案(如问题描述中所述)。我想我应该进一步扩展我提出的解决方案。
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 之后,您可以简单地将它们 collect
解析为 Map
基于 empName
字段使用 Stream API:
List<EmployeeDTO> jsonSchema; // parsed JSON List
Map<String, EmployeeDTO> result = jsonSchema.stream().collect(Collectors.toMap(EmployeeDTO::getEmpName, Function.identity()));
假设我有以下 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>
最初,我在问题中添加了
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 之后,您可以简单地将它们 collect
解析为 Map
基于 empName
字段使用 Stream API:
List<EmployeeDTO> jsonSchema; // parsed JSON List
Map<String, EmployeeDTO> result = jsonSchema.stream().collect(Collectors.toMap(EmployeeDTO::getEmpName, Function.identity()));