java - 如何使用 JAVA 从动态创建的 JSON 中递归获取所有键值对
问题描述
有什么方法可以将字段和值转换为 Java 代码。例如,我有以下 JSON:
{
"name":"Example",
"description":"An example",
"process_1": {
"name":"My process-1",
"image":"Docker Image",
"command":["command", "file_name"],
"arguments":["--arg"]
},
"process_2": {
"name":"My process-2",
"image":"Docker Image",
"command":["command", "file_name"],
"arguments":["--arg"]
}
.
.
.
.
"process_n": {
"name":"My process-n",
"image":"Docker Image",
"command":["command", "file_name"],
"arguments":["--arg"]
}
}
现在我想将所有的键作为变量获取它们在 java 中的对应值。请注意,JSON 中的字段名称不是恒定的,即 JSON 文件是每次使用不同的字段名称动态创建的。名称和描述字段以及进程内的字段是常量。但不是流程领域。
例如,在 Java 中它应该如下所示:
String name = "Example"
String description = "An Example"
String process_1_name = "My process-1"
String process_2_command = ["command", "file_name"]
另外我不知道如何将级联字段存储为“process-1”。
解决方案
您的 json 无效 - 在"arguments":["--arg"],
.
对于解析,您可以使用com.fasterxml.jackson.databind.ObjectMapper
和 Map:
public static void main(String[] args) throws IOException {
String json = "{\n" +
" \"name\":\"Example\",\n" +
" \"description\":\"An example\",\n" +
" \"process-1\": {\n" +
" \"name\":\"My process-1\",\n" +
" \"image\":\"Docker Image\",\n" +
" \"command\":[\"command\", \"file_name\"],\n" +
" \"arguments\":[\"--arg\"]\n" +
" },\n" +
" \"process-2\": {\n" +
" \"name\":\"My process-1\",\n" +
" \"image\":\"Docker Image\",\n" +
" \"command\":[\"command\", \"file_name\"],\n" +
" \"arguments\":[\"--arg\"]\n" +
" }\n" +
"}\n";
ObjectMapper mapper = new ObjectMapper();
LinkedHashMap valueMap = mapper.readValue(json, LinkedHashMap.class);
Object name = valueMap.get("name");
Object description = valueMap.get("description");
System.out.println("name: " + name);
System.out.println("description: " + description);
Map process1 = (Map) valueMap.get("process-1");
Object process1Name = process1.get("name");
Object process1Image = process1.get("image");
System.out.println("process1Name: " + process1Name);
System.out.println("process1Image: " + process1Image);
mapper.writeValue(new File("./process-1.json"), process1);
mapper.writeValue(new File("./process-2.json"), (Map) valueMap.get("process-2"));
}
输出:
name: Example
description: An example
process1Name: My process-1
process1Image: Docker Image
推荐阅读
- python - Kivy:如何屏蔽所有用户交互?
- r - 如何使用 Plotly 在 R 中添加趋势线
- autodesk-forge - BIM360 Docs GET 文件夹内容页数限制
- python - 在 Django 中使用 jsonb_object_keys postgres 函数?
- amazon-web-services - AWS ElasticSearch - 自动化手动快照
- ios - 索引 16 越界;swift中的字符串长度为0
- spring-boot - Spring Boot:自动配置的工作原理和@JsonTest
- redirect - 限制 HTTP 引用者的请求 - IIS
- powerbi - Power BI-创建单选按钮筛选器(右侧窗格,不在仪表板/工作表上)
- view - ORACLE - 解码视图谓词并应用于基表