Использование Jackson для сопоставления объекта с определенным node в дереве JSON

Можно ли использовать jsonson ObjectMapper unmarshall только из определенного node (и 'down') в дереве JSON?

Вариант использования - формат расширяемого документа. Я хочу пройти дерево, а затем опубликовать текущий путь к расширяемому набору плагинов, чтобы узнать, использует ли пользователь и плагины, которые знают, что делать с этой частью документа.

Я бы хотел, чтобы авторы плагинов не имели дело с деталями низкого уровня JsonNode или потокового API; вместо этого просто передайте некоторый контекст и конкретный JsonNode, а затем сможете использовать прекрасный и удобный ObjectMapper, чтобы размонтировать экземпляр своего класса, учитывая, что node передан как корень дерева.

Ответ 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 node в следующий класс Java:

public class Coordinates {

    private Double latitude;

    private Double longitude;

    // Default constructor, getters and setters omitted
}

Чтобы сделать это, проанализируйте весь JSON в JsonNode с ObjectMapper:

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 node и используйте ObjectMapper, чтобы проанализировать его в классе coordinates:

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

JSON Pointer - это язык пути для перемещения JSON. Подробнее см. RFC 6901. Он доступен в Джексоне с версии 2.3.