JavaTuples API - 无法反序列化,因为它们没有参数构造函数

问题描述 投票:0回答:2

我正在使用 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 可能会有所帮助。但也欢迎其他简单的解决方案。

java jackson tuples jackson-modules
2个回答
0
投票

JSON 对象似乎映射到

class T {
 int size;
 List<String> value1;
 List<String> value2;
 List<String> value3;
}

为什么不反序列化到这个对象中?


0
投票

根据我的研究,你无法在 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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.