杰克逊在通用列表中读取 json

新手上路,请多包涵

我正在使用 Jackson 来读取 json 消息。我试图解析的值之一是列表,另一个值包含列表中数据的类型。这是我在 java 中创建的结构。

 public class Message<T> {
   private Timestamp time;
   private RestAction action;
   private String type;
   private List<T> data;
}

通过 Class.forName(); 我可以获得代表列表中数据的类。问题是我如何阅读列表。

原文由 Lalao 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 590
2 个回答

如果您需要将传入的 json 映射到您的列表,您可以这样做

String jsonString = ...; //Your incoming json string
ObjectMapper mapper = new ObjectMapper();
Class<?> clz = Class.forName(yourTypeString);
JavaType type = mapper.getTypeFactory().constructCollectionType(List.class, clz);
List <T> result = mapper.readValue(jsonString, type);

编辑

像这样的东西,完全未经测试,从未做过

public Message<T> deserialize(JsonParser jsonParser, DeserializationContext arg1)
    throws IOException, JsonProcessingException {
    ObjectMapper mapper = new ObjectMapper();
    ObjectCodec oc = jsonParser.getCodec();
    JsonNode node = oc.readTree(jsonParser);

    JsonNode timeStamp = node.get("time");
    Timestamp time = mapper.readValue(timeStamp, Timestamp.class);
    JsonNode restAction = node.get("action");
    RestAction action = mapper.readValue(restAction, RestAction.class);
    String type = node.get("type").getTextValue();
    Class<?> clz = Class.forName(type);
    JsonNode list = node.get("data");
    JavaType listType = mapper.getTypeFactory().constructCollectionType(List.class,   clz);
    List <T> data = mapper.readValue(list, listType);

    Message<T> message = new Message<T>;
    message.setTime(time);
    message.setAction(action);
    message.setType(type);
    message.setData(data);

    return message;
}

原文由 alex 发布,翻译遵循 CC BY-SA 3.0 许可协议

更短的东西:

 mapper.readValue(jsonString, new TypeReference<List<EntryType>>() {});

其中 EntryType 是对您希望在集合中保留的类型的引用。它可以是任何 Java 类。例如读取 JSON 表示形式,例如 ["a", "b", "c"] 映射器的第二个参数应该是 new TypeReference<List<String>>() {}

原文由 splatch 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题