Java:查找JSON对象属性为精确JSON子字符串(具有精确格式)



我需要从JSON对象中提取一个字段,作为具有完全相同格式和保留所有空白的子字符串。

例如,当我有这个对象:

{
"body": 
{
"name": "John",
"surname": "Smith"
},
"signature": "message_signature"
}

我需要提取字段body作为一个精确的子字符串。

所以结果应该是这样的:

{
"name": "John",
"surname": "Smith"
}

我不能使用标准的JSON库,如Jackson,因为它将JSON解析为树结构,格式丢失。我需要一些库,它将能够返回任何给定节点的原始子字符串。

我需要这个的原因是验证消息签名,它考虑了所有的空白(它是一个第三方API,对此无能为力)。

您可以通过为body属性编写自定义反序列化器来使用Jackson实现这一点。在反序列化器中,您将提取起始"{"和结束"}"

查看这里的展示(忽略正确的错误/边缘情况处理):

public class App {
public static void main(String[] args) throws JsonMappingException, JsonProcessingException {
var json = """
{
"body":
{
"name": "John",
"surname": "Smith"
},
"signature": "message_signature"
}
""";
var om = new ObjectMapper();
System.out.println(om.readValue(json, Data.class));
}
public static class BodyDeserializer extends JsonDeserializer<String> {
@Override
public String deserialize(JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
var startBody = (int) jp.getCurrentLocation().getCharOffset();
jp.skipChildren();
var endBody = (int) jp.getCurrentLocation().getCharOffset();
var rawJson = jp.getCurrentLocation().getSourceRef().toString();
return rawJson.substring(startBody - 1, endBody);
}
}
public static class Data {
@JsonProperty("body")
@JsonDeserialize(using = BodyDeserializer.class)
public String body;
@JsonProperty("signature")
public String signature;
@Override
public String toString() {
return "Data [body=" + body + ", signature=" + signature + "]";
}
}
}

最新更新