【发布时间】:2020-09-07 05:00:22
【问题描述】:
我是 Spring-boot 的新手,正在尝试在 Spring-boot 应用程序中使用 Jackson 将 json 数组反序列化为 java String。类似的东西
{"history": ["historyA", "historyB"]} (JSON Request Body) -> String history;
但是,记录了以下错误消息。
Cannot deserialize instance of `java.lang.String` out of START_ARRAY token
我的控制器类似于
@RestController
public class PatientController {
@PostMapping
public void create(@RequestBody @Valid Patient patient) {
mapper.create(patient);
}
}
我的 POJO 类似于:
@Data
@NoArgsConstructor
public class Patient {
@JsonDeserialize(contentUsing = PatientHistoryDeserializer.class, contentAs = List.class)
private String history;
我的 Json Deserializer 类似于:
public class PatientHistoryDeserializer extends JsonDeserializer<String> {
@Override
public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
List<String> histories = new LinkedList<>();
if (p.getCurrentToken() == JsonToken.START_ARRAY) {
while (p.getCurrentToken() != JsonToken.END_ARRAY) {
String history = p.getValueAsString();
if(history.contains("#"))
throw new ClientError(HttpServletResponse.SC_BAD_REQUEST, "invalid...");
histories.add(history);
}
}
return String.join("#", histories);
}
}
我的目标可以实现吗?或者关于如何转换的任何建议?
【问题讨论】:
-
您可以正常反序列化为List,并在getter中加入所有字符串并返回。
-
为此我有自己的 JsonSerializer。顺便说一句,是否有可能一开始就将他们加入二传手?
标签: java json spring spring-boot jackson