【问题标题】:Using Jackson to map object from specific node in JSON tree使用 Jackson 从 JSON 树中的特定节点映射对象
【发布时间】:2016-06-23 15:55:51
【问题描述】:

是否可以让 Jackson 的 ObjectMapper 仅从 JSON 树中的特定节点(和“向下”)解组?

用例是一种可扩展的文档格式。我想遍历树,然后将当前路径发布到一组可扩展的插件,以查看用户是否正在使用以及知道如何处理文档的该部分的插件。

我希望插件作者不必处理 JsonNode 或流 API 的低级细节;相反,只需传递一些上下文和特定的JsonNode,然后考虑作为树的根传递的节点,就可以使用可爱且方便的ObjectMapper 来解组其类的实例。

【问题讨论】:

标签: java json jackson


【解决方案1】:

考虑以下 JSON:

{
  "firstName": "John",
  "lastName": "Doe",
  "address": {
    "street": "21 2nd Street",
    "city": "New York",
    "postalCode": "10021-3100",
    "coordinates": {
      "latitude": 40.7250387,
      "longitude": -73.9932568
    }
  }
}

并考虑您想将 coordinates 节点解析为以下 Java 类:

public class Coordinates {

    private Double latitude;

    private Double longitude;
    
    // Default constructor, getters and setters omitted
}

为此,请将整个 JSON 解析为 JsonNodeObjectMapper

String json = "{\"firstName\":\"John\",\"lastName\":\"Doe\",\"address\":{\"street\":"
            + "\"21 2nd Street\",\"city\":\"New York\",\"postalCode\":\"10021-3100\","
            + "\"coordinates\":{\"latitude\":40.7250387,\"longitude\":-73.9932568}}}";

ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readTree(json);

然后使用JSON Pointer查询coordinates节点并使用ObjectMapper解析成Coordinates类:

JsonNode coordinatesNode = node.at("/address/coordinates");
Coordinates coordinates = mapper.treeToValue(coordinatesNode, Coordinates.class);

JSON Pointer 是一种遍历 JSON 的路径语言。更多详情,请查看RFC 6901。从 2.3 版开始,它在 Jackson 中可用。

【讨论】:

  • 这正是我所追求的!一旦我有机会实施它,我将奖励赏金。
  • 我会说node.get("address") 在这种情况下更简单/更有效。
  • @shmosel 当然是。但这里的重点是可用于查询节点的 JSON 路径。我作为示例提供的 JSON 非常简单,我们无法看到使用 JSON Path 的优势。
  • @CássioMazzochiMolin,哎呀,我没有意识到这是一个人为的例子。
  • 答案更新了一个稍微复杂的例子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-12
  • 2015-12-23
  • 1970-01-01
  • 2017-10-21
  • 2012-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多