jackson JavaTuples API -无法解析,因为它们没有args构造函数

neskvpey  于 7个月前  发布在  Java
关注(0)|答案(2)|浏览(67)

我使用javatuples,因为我必须从几个方法调用中返回多个参数。
一切似乎都很好,直到我试图将jsonString转换为Triplet。看起来元组类(Triplet等)没有无参数构造函数,所以Jackson无法实现。
我的代码大致如下-

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的示例(不存在创建者,如默认构造函数):无法从对象值反序列化(没有基于委托或属性的创建者)

**我还有其他工作吗?**我的实际数据非常庞大,因此我的情况需要荒漠化方法。是否有任何Jackson配置等,可以解决这个问题。

我想一个自定义的JSON编译器可能会有帮助。但其他简单的解决方案也很受欢迎。

xqk2d5yq

xqk2d5yq1#

根据我的研究,你不能在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;
    }
}
pw136qt2

pw136qt22#

JSON对象似乎Map到

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

为什么不把它变成这个物体呢?

相关问题