通过 java 解析包含动态字段的 JSON 文件
Parse JSON file with dynamic fields by java
如何使用包含动态字段的对象解析 JSON 文件。
作为此处的示例:这是“项目”,其中包含名称为(“1c68b853-2a07-4409-ad61-8650212f3260”)和正文的对象。而且还不止2件。
{
"id": "3c49a7aa-77e0-43cf-956c-a1ff970d7db2",
"code": "citizenship_country",
"name": "Гражданство",
"items": {
"1c68b853-2a07-4409-ad61-8650212f3260": {
"name": {
"id": "1c68b853-2a07-4409-ad61-8650212f3260",
"value": "ДЖЕРСИ",
"translation": "ДЖЕРСИ"
},
"modifiedDate": {
"id": "1c68b853-2a07-4409-ad61-8650212f3260",
"value": "мая 28, 2015",
"translation": null
},
"id": {
"id": "1c68b853-2a07-4409-ad61-8650212f3260",
"value": "237",
"translation": null
}
},
"dfd37aec-4ae7-4d8b-8e92-3a25fab57dd7": {
"name": {
"id": "dfd37aec-4ae7-4d8b-8e92-3a25fab57dd7",
"value": "РОССИЯ",
"translation": "РОССИЯ"
},
"modifiedDate": {
"id": "dfd37aec-4ae7-4d8b-8e92-3a25fab57dd7",
"value": "мая 28, 2015",
"translation": null
},
"id": {
"id": "dfd37aec-4ae7-4d8b-8e92-3a25fab57dd7",
"value": "185",
"translation": null
}
}
}
}
您可以手动解析 Json。例如,如果您使用 jackson 库 (com.fasterxml.jackson.databind),您可以
var objectMapper = new ObjectMapper();
JsonNode jsonRoot = objectMapper.readTree(jsonStr);
那你就可以深挖结构了
jsonRoot.path("items").path("1c68b853-2a07-4409-ad61-8650212f3260").asText()
您还可以枚举个人节点的成员。其他库即 Gson 具有相同的功能
您可以轻松使用Map
界面,存储动态部分:
Root.java:
package com.example.trial.dto;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
public class Root {
public String id;
public String code;
public String name;
public Map<UUID, Map<String, Item>> items = new HashMap<>();
}
Item.java:
package com.example.trial.dto;
import java.util.UUID;
public class Item {
public UUID id;
public String value;
public String translation;
}
MappingTest.java:
package com.example.trial.services;
import com.example.trial.dto.Root;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import java.io.IOException;
public class MappingTest {
ObjectMapper objectMapper = new ObjectMapper();
@Test
public void convert() throws IOException {
Root root = objectMapper.readValue("{\n" +
" \"id\": \"3c49a7aa-77e0-43cf-956c-a1ff970d7db2\",\n" +
" \"code\": \"citizenship_country\",\n" +
" \"name\": \"Гражданство\",\n" +
" \"items\": {\n" +
" \"1c68b853-2a07-4409-ad61-8650212f3260\": {\n" +
" \"name\": {\n" +
" \"id\": \"1c68b853-2a07-4409-ad61-8650212f3260\",\n" +
" \"value\": \"ДЖЕРСИ\",\n" +
" \"translation\": \"ДЖЕРСИ\"\n" +
" },\n" +
" \"modifiedDate\": {\n" +
" \"id\": \"1c68b853-2a07-4409-ad61-8650212f3260\",\n" +
" \"value\": \"мая 28, 2015\",\n" +
" \"translation\": null\n" +
" },\n" +
" \"id\": {\n" +
" \"id\": \"1c68b853-2a07-4409-ad61-8650212f3260\",\n" +
" \"value\": \"237\",\n" +
" \"translation\": null\n" +
" }\n" +
" },\n" +
" \"dfd37aec-4ae7-4d8b-8e92-3a25fab57dd7\": {\n" +
" \"name\": {\n" +
" \"id\": \"dfd37aec-4ae7-4d8b-8e92-3a25fab57dd7\",\n" +
" \"value\": \"РОССИЯ\",\n" +
" \"translation\": \"РОССИЯ\"\n" +
" },\n" +
" \"modifiedDate\": {\n" +
" \"id\": \"dfd37aec-4ae7-4d8b-8e92-3a25fab57dd7\",\n" +
" \"value\": \"мая 28, 2015\",\n" +
" \"translation\": null\n" +
" },\n" +
" \"id\": {\n" +
" \"id\": \"dfd37aec-4ae7-4d8b-8e92-3a25fab57dd7\",\n" +
" \"value\": \"185\",\n" +
" \"translation\": null\n" +
" }\n" +
" }\n" +
" }\n" +
"}", Root.class);
objectMapper.writeValue(System.out, root);
}
}
您也可以为name
、modifiedDate
、id
创建三个不同的类,但这足以说明主要思想回答。
如何使用包含动态字段的对象解析 JSON 文件。 作为此处的示例:这是“项目”,其中包含名称为(“1c68b853-2a07-4409-ad61-8650212f3260”)和正文的对象。而且还不止2件。
{
"id": "3c49a7aa-77e0-43cf-956c-a1ff970d7db2",
"code": "citizenship_country",
"name": "Гражданство",
"items": {
"1c68b853-2a07-4409-ad61-8650212f3260": {
"name": {
"id": "1c68b853-2a07-4409-ad61-8650212f3260",
"value": "ДЖЕРСИ",
"translation": "ДЖЕРСИ"
},
"modifiedDate": {
"id": "1c68b853-2a07-4409-ad61-8650212f3260",
"value": "мая 28, 2015",
"translation": null
},
"id": {
"id": "1c68b853-2a07-4409-ad61-8650212f3260",
"value": "237",
"translation": null
}
},
"dfd37aec-4ae7-4d8b-8e92-3a25fab57dd7": {
"name": {
"id": "dfd37aec-4ae7-4d8b-8e92-3a25fab57dd7",
"value": "РОССИЯ",
"translation": "РОССИЯ"
},
"modifiedDate": {
"id": "dfd37aec-4ae7-4d8b-8e92-3a25fab57dd7",
"value": "мая 28, 2015",
"translation": null
},
"id": {
"id": "dfd37aec-4ae7-4d8b-8e92-3a25fab57dd7",
"value": "185",
"translation": null
}
}
}
}
您可以手动解析 Json。例如,如果您使用 jackson 库 (com.fasterxml.jackson.databind),您可以
var objectMapper = new ObjectMapper();
JsonNode jsonRoot = objectMapper.readTree(jsonStr);
那你就可以深挖结构了
jsonRoot.path("items").path("1c68b853-2a07-4409-ad61-8650212f3260").asText()
您还可以枚举个人节点的成员。其他库即 Gson 具有相同的功能
您可以轻松使用Map
界面,存储动态部分:
Root.java:
package com.example.trial.dto;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
public class Root {
public String id;
public String code;
public String name;
public Map<UUID, Map<String, Item>> items = new HashMap<>();
}
Item.java:
package com.example.trial.dto;
import java.util.UUID;
public class Item {
public UUID id;
public String value;
public String translation;
}
MappingTest.java:
package com.example.trial.services;
import com.example.trial.dto.Root;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import java.io.IOException;
public class MappingTest {
ObjectMapper objectMapper = new ObjectMapper();
@Test
public void convert() throws IOException {
Root root = objectMapper.readValue("{\n" +
" \"id\": \"3c49a7aa-77e0-43cf-956c-a1ff970d7db2\",\n" +
" \"code\": \"citizenship_country\",\n" +
" \"name\": \"Гражданство\",\n" +
" \"items\": {\n" +
" \"1c68b853-2a07-4409-ad61-8650212f3260\": {\n" +
" \"name\": {\n" +
" \"id\": \"1c68b853-2a07-4409-ad61-8650212f3260\",\n" +
" \"value\": \"ДЖЕРСИ\",\n" +
" \"translation\": \"ДЖЕРСИ\"\n" +
" },\n" +
" \"modifiedDate\": {\n" +
" \"id\": \"1c68b853-2a07-4409-ad61-8650212f3260\",\n" +
" \"value\": \"мая 28, 2015\",\n" +
" \"translation\": null\n" +
" },\n" +
" \"id\": {\n" +
" \"id\": \"1c68b853-2a07-4409-ad61-8650212f3260\",\n" +
" \"value\": \"237\",\n" +
" \"translation\": null\n" +
" }\n" +
" },\n" +
" \"dfd37aec-4ae7-4d8b-8e92-3a25fab57dd7\": {\n" +
" \"name\": {\n" +
" \"id\": \"dfd37aec-4ae7-4d8b-8e92-3a25fab57dd7\",\n" +
" \"value\": \"РОССИЯ\",\n" +
" \"translation\": \"РОССИЯ\"\n" +
" },\n" +
" \"modifiedDate\": {\n" +
" \"id\": \"dfd37aec-4ae7-4d8b-8e92-3a25fab57dd7\",\n" +
" \"value\": \"мая 28, 2015\",\n" +
" \"translation\": null\n" +
" },\n" +
" \"id\": {\n" +
" \"id\": \"dfd37aec-4ae7-4d8b-8e92-3a25fab57dd7\",\n" +
" \"value\": \"185\",\n" +
" \"translation\": null\n" +
" }\n" +
" }\n" +
" }\n" +
"}", Root.class);
objectMapper.writeValue(System.out, root);
}
}
您也可以为name
、modifiedDate
、id
创建三个不同的类,但这足以说明主要思想回答。