代码之家  ›  专栏  ›  技术社区  ›  CodeBot

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

  •  1
  • CodeBot  · 技术社区  · 2 年前

    我正在使用 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 (没有创建者, 与默认构造函数一样,存在):无法从Object值反序列化 (没有基于委托或财产的创建者)

    我还有其他解决办法吗? 我的实际数据非常庞大,所以我的案例需要去激怒化的方法。 有没有任何jackson配置等可以解决这个问题。

    我认为自定义JsonDeserializer可能会有所帮助。但也欢迎其他简单的解决方案。

    2 回复  |  直到 2 年前
        1
  •  1
  •   Diego Borba    2 年前

    根据我的研究,你不能在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;
        }
    }
    
        2
  •  0
  •   PeterMmm    2 年前

    JSON对象似乎映射到

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

    为什么不反序列化到此对象?