gpt4 book ai didi

java - 使用 Jackson 和 Spring-Boot 将 Base64 编码的 JSON 解码为 POJO

转载 作者:行者123 更新时间:2023-11-30 02:30:38 27 4
gpt4 key购买 nike

我有一个这样的请求

{
"varA" : "A",
"varB" : "TCFNhbiBKb3NlMRgwFgYDVQQK"
}

其中 key varB 是一个 base64 编码的 JSON 字符串。像这样的东西:

{
"nestedVarB1": "some value here",
"nestedVarB2" : "some other value here"
}

我想将它转换成一些 POJO,如下所示:

@Data
public class MyRequest {
private String varA;
private B varB;
}

@Data
public class B {
private String nestedVarB1;
private String nestedVarB2;
}

我经历了几个关于堆栈溢出的解决方案,例如 thisthis ,但我想通过编写某种 Jackson 反序列化器将 JSON 直接转换为 MyRequest 类型的对象。

如何使用 Jackson 和 Spring Boot 将 JSON 直接转换为 MyRequest

注意:

  1. POJO MyRequestB 非常大,B 可以进一步嵌套,因此手动执行将是一项艰巨的任务。<
  2. 我无法控制传入的请求,它来自第三方来源。因此,无法更改请求的格式。

最佳答案

我做了一些实验,这是一个简单的 Jackson 反序列化器,应该适合您。

Deserializer 实现 ContextualDeserializer 接口(interface)来访问实际的 bean 属性(例如 varB)。它对于检测正确的结果类型是必要的,因为反序列化器本身可以附加到任何类型的字段。

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.deser.ContextualDeserializer;
import com.fasterxml.jackson.databind.exc.InvalidFormatException;

import java.io.IOException;
import java.util.Base64;

public class Base64Deserializer extends JsonDeserializer<Object> implements ContextualDeserializer {

private Class<?> resultClass;

@Override
public JsonDeserializer<?> createContextual(DeserializationContext context, BeanProperty property) throws JsonMappingException {
this.resultClass = property.getType().getRawClass();
return this;
}

@Override
public Object deserialize(JsonParser parser, DeserializationContext context) throws IOException, JsonProcessingException {
String value = parser.getValueAsString();
Base64.Decoder decoder = Base64.getDecoder();

try {
ObjectMapper objectMapper = new ObjectMapper();
byte[] decodedValue = decoder.decode(value);

return objectMapper.readValue(decodedValue, this.resultClass);
} catch (IllegalArgumentException | JsonParseException e) {
String fieldName = parser.getParsingContext().getCurrentName();
Class<?> wrapperClass = parser.getParsingContext().getCurrentValue().getClass();

throw new InvalidFormatException(
parser,
String.format("Value for '%s' is not a base64 encoded JSON", fieldName),
value,
wrapperClass
);
}
}
}

这是映射类的示例。

public class MyRequest {

private String varA;

@JsonDeserialize(using = Base64Deserializer.class)
private B varB;

public String getVarA() {
return varA;
}

public void setVarA(String varA) {
this.varA = varA;
}

public B getVarB() {
return varB;
}

public void setVarB(B varB) {
this.varB = varB;
}
}

关于java - 使用 Jackson 和 Spring-Boot 将 Base64 编码的 JSON 解码为 POJO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44371500/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com