想知道是否有可能以某种方式将动态 JSON 对象(无固定模式)转换为 java 对象?
例如:
第一次,我可以在运行时使用以下 JSON 对象登陆:
{
"addressDetails": {
"homeAddresses": [
{
"houseNo": "1",
"city": "2"
}
],
"currentAddress": {
"houseNo": "1",
"city": "2"
}
},
"personalDetails": {
"birthDetails": {
"birthPlace": "1",
"birthMonth": "2"
}
},
"confidentialDetails": {
"birthDetails": {
"birthPlace": "1",
"birthMonth": "2"
}
},
"bankingDetails": {
"bankName": "1",
"bankAccountNo": 2
}
}
下次,也许是这样的:
{
"confidentialDetails": {
"birthDetails": {
"birthPlace": "1",
"birthMonth": "2"
}
},
"personalDetails": {
"birthDetails": {
"birthPlace": "1",
"birthMonth": "2"
}
}
}
我如何处理所有这些变化? jackson/Gson 或其他图书馆有可能吗?
期待找到一个非常通用的解决方案,可以优雅地处理 JSON 对象的不同变化。
不知道我是否理解你的问题。但是,您可以尝试将所有可能的 JSON 对象定义为一个对象,然后使用 GSON 或其他 JSON 转换工具将它们序列化。 像这样:
public class Parent {
private AddressDetails addressDetails;
private PersonalDetails personalDetails;
private PersonalDetails confidentialDetails;
}
class AddressDetails{
private List<HomeAddresses> homeAddresses;
private List<CurrentAddress> currentAddresses;
}
class Addresses{
private String houseNo;
private String city;
}
class BirthDetails{
private String birthDetails;
private String birthMonth;
}
class HomeAddresses extends Addresses{
}
class CurrentAddress extends Addresses{
}
class PersonalDetails extends BirthDetails{
}
或者定义的类型太多,可以简单的把JSON字符串转成JSON对象来使用 像这样:
String jsonStr = "{\n" +
" \"addressDetails\": {\n" +
" \"homeAddresses\": [\n" +
" {\n" +
" \"houseNo\": \"1\",\n" +
" \"city\": \"2\"\n" +
" }\n" +
" ],\n" +
" \"currentAddress\": {\n" +
" \"houseNo\": \"1\",\n" +
" \"city\": \"2\"\n" +
" }\n" +
" },\n" +
" \"personalDetails\": {\n" +
" \"birthDetails\": {\n" +
" \"birthPlace\": \"1\",\n" +
" \"birthMonth\": \"2\"\n" +
" }\n" +
" },\n" +
" \"confidentialDetails\": {\n" +
" \"birthDetails\": {\n" +
" \"birthPlace\": \"1\",\n" +
" \"birthMonth\": \"2\"\n" +
" }\n" +
" },\n" +
" \"bankingDetails\": {\n" +
" \"bankName\": \"1\",\n" +
" \"bankAccountNo\": 2\n" +
" }\n" +
"}";
JSONObject jsonObject = JSONUtil.parseObj(jsonStr);
JSONObject addressDetails = jsonObject.get("addressDetails", JSONObject.class);
JSONArray homeAddresses = addressDetails.get("homeAddresses", JSONArray.class);
JSONObject object = homeAddresses.get(0, JSONObject.class);
System.out.println(object.get("houseNo"));
System.out.println(object.get("city"));
杰克逊图书馆可以做到这一点。只需读取 JSON 并使用
addressDetails
和 bankingDetails
键删除数据。
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.node.ObjectNode;
import java.io.IOException;
public class JavaApplication {
public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
ObjectNode jsonData = (ObjectNode) mapper.readTree("{\"addressDetails\":{\"homeAddresses\":[{\"houseNo\":\"1\",\"city\":\"2\"}],\"currentAddress\":{\"houseNo\":\"1\",\"city\":\"2\"}},\"personalDetails\":{\"birthDetails\":{\"birthPlace\":\"1\",\"birthMonth\":\"2\"}},\"confidentialDetails\":{\"birthDetails\":{\"birthPlace\":\"1\",\"birthMonth\":\"2\"}},\"bankingDetails\":{\"bankName\":\"1\",\"bankAccountNo\":2}}");
jsonData.remove("addressDetails");
jsonData.remove("bankingDetails");
System.out.println(mapper.writeValueAsString(jsonData));
}
}
输出将是:
{
"personalDetails" : {
"birthDetails" : {
"birthPlace" : "1",
"birthMonth" : "2"
}
},
"confidentialDetails" : {
"birthDetails" : {
"birthPlace" : "1",
"birthMonth" : "2"
}
}
}
Java 是一种类型化语言。如果你这样做,你将失去语言提供的类型检查的一些好处
话虽如此,您可以将其反序列化为
Map<String,Object>
public static void main(String[] args) throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper(); // This is an expensive operation. objectMapper is thread-safe so it cane be shared
String inboundJsonStr = "{\"name\":\"Jane Doe\",\"id\":2,\"is_active\":null}";
Map<String,Object> jsonObject = objectMapper.readValue(inboundJsonStr, Map.class);
}
ObjectMapper 来自杰克逊图书馆