如何将具有转义 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 字段 innerKey1
和 innerKey2
是 public.
我有一个JSON如下
{
"fixedKey1" : "value1",
"fixedKey2" : "value2",
"fixedKey3" : "{\"DYNAMICKEY\":{\"innerKey1\":\"innerVal1\",\"innerKey2\":\"innerVal1\"}}"
}
我只想提取 fixedKey3 中的内部 JSON 键和值。
请注意,fixedKey3 是一个复杂的字符串,它有一个我无法控制的动态键。它在每个响应中都是不同的,因此永远不能成为固定的关键参数。
到目前为止我已经写了下面的代码,反复试验没有成功
下面是整个JSON
的外层classclass 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 字段 innerKey1
和 innerKey2
是 public.