将动态 JSON 反序列化为 java 对象

问题描述 投票:0回答:3

想知道是否有可能以某种方式将动态 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 对象的不同变化。

java json jackson gson json-deserialization
3个回答
0
投票

不知道我是否理解你的问题。但是,您可以尝试将所有可能的 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"));

0
投票

杰克逊图书馆可以做到这一点。只需读取 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"
    }
  }
}

-1
投票

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 来自杰克逊图书馆

© www.soinside.com 2019 - 2024. All rights reserved.