如何将具有转义 JSON 和动态键的参数字符串的自定义对象反序列化为 Java 对象

How to deserialize a custom object that has a parameter string with escaped JSON and dynamic key into Java Object

我有一个JSON如下

{
   "fixedKey1" : "value1",
   "fixedKey2" : "value2",
   "fixedKey3" : "{\"DYNAMICKEY\":{\"innerKey1\":\"innerVal1\",\"innerKey2\":\"innerVal1\"}}"
}

我只想提取 fixedKey3 中的内部 JSON 键和值。

请注意,fixedKey3 是一个复杂的字符串,它有一个我无法控制的动态键。它在每个响应中都是不同的,因此永远不能成为固定的关键参数。

到目前为止我已经写了下面的代码,反复试验没有成功

下面是整个JSON

的外层class
class Outer {
  String fixedKey1;

  String fixedKey2;

  @JsonProperty("fixedKey3")
  public void setFixedKey3(String input) {
      ObjectMapper mapper = new ObjectMapper();

      //NEED help here
      mapper.readValue(input, InnerData.class);
  }
}

下面是内部 class 应该包含内部值数据。

class InnerData {
   String innerKey1;

   String innerKey2;
}

如果你能帮助我,我将不胜感激。提前致谢。

关于您的场景的第一个问题是关于 "fixedKey3" : "{\"DYNAMICKEY\":{\"innerKey1\":\"innerVal1\",\"innerKey2\":\"innerVal1\"}}" 包含转义双引号:解决您的问题的第一步是使用 readTree method and read the JsonNode obtained with asText 摆脱转义双引号,如下所示:

JsonNode root = mapper.readTree(json);
//s will contains {"DYNAMICKEY":{"innerKey1":"innerVal1","innerKey2":"innerVal1"}}
String s = root.get("fixedKey3").asText();

要获得 "DYNAMICKEY" 动态密钥,您可以使用 fieldNames method and with the treeToValue 方法将获得的 JsonNode 映射到您期望的一个 InnerData 对象:

JsonNode dinamycKeyNode = mapper.readTree(s);
String dynamicKey = dinamycKeyNode.fieldNames().next(); //<-- it will contains your dynamic key
//mapping the {"innerKey1":"innerVal1","innerKey2":"innerVal1"} to InnerData
InnerData innerData = mapper.treeToValue(dinamycKeyNode.get(dynamicKey), InnerData.class);

注意:为了简化 InnerData class 字段 innerKey1innerKey2 是 public.