我正在使用 javatuples,因为我必须从几个方法调用中返回多个参数。
一切看起来都很好,直到我尝试将 jsonString 反序列化为 Triplet。 似乎元组类(Triplet 等)没有无参数构造函数,因此杰克逊无法反序列化。
我的代码大致如下-
String json = """{"size":3,"value0":["dataPoint1", "dataPoint2"],"value1":["dataPoint3"],"value2":["dataPoint2", "dataPoint3"]}""";
Triplet<List<String>, List<String>, List<String>> serviceResponse = objectMapper.readValue(json, new TypeReference<>(){});
我得到的例外是 -
无法构造
的实例(没有创建者, 像默认构造函数一样,存在):无法从对象值反序列化 (没有基于委托或财产的创建者)org.javatuples.Triplet
我还有其他解决方法吗?我的实际数据非常巨大,因此我的案例需要反序列化方法。 有没有杰克逊配置等可以解决这个问题。
我认为自定义 JsonDeserializer 可能会有所帮助。但也欢迎其他简单的解决方案。
JSON 对象似乎映射到
class T {
int size;
List<String> value1;
List<String> value2;
List<String> value3;
}
为什么不反序列化到这个对象中?
根据我的研究,你无法在 Jackson 中配置此功能。在我看来,最好的解决方案是使用
Custom JsonDeserializer
,正如您所知。
根据你的例子,我这样做:
public class TripletDeserializer extends JsonDeserializer<Triplet<List<String>, List<String>, List<String>>> {
@Override
public Triplet<List<String>, List<String>, List<String>> deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
JsonNode node = jsonParser.getCodec().readTree(jsonParser);
return new Triplet<>(getNodeList(node.get("value0")), getNodeList(node.get("value1")), getNodeList(node.get("value2")));
}
private List<String> getNodeList(JsonNode valueNode) {
List<String> value = new ArrayList<>();
if (valueNode != null && valueNode.isArray()) {
for (JsonNode element : valueNode) {
value.add(element.asText());
}
}
return value;
}
}