Est-il possible d’avoir ObjectMapper
de Jackson unmarshall uniquement à partir d’un nœud spécifique (et “down”) dans une arborescence JSON?
Le cas d’utilisation est un format de document extensible. Je souhaite parcourir l’arborescence, puis publier le chemin actuel sur un ensemble extensible de plug-ins, pour voir si l’utilisateur utilise des plug-ins qui savent quoi faire avec cette partie du document.
J’aimerais que les auteurs de plug-in n’aient pas à gérer les détails de bas niveau de JsonNode
ou de l’API de streaming; Au lieu de cela, il suffit de passer un contexte et un JsonNode
spécifique, puis de pouvoir utiliser JsonNode
, charmant et pratique, pour ObjectMapper
instance de leur classe, en considérant le nœud transmis comme racine de l’arbre.
Considérez le JSON suivant:
{ "firstName": "John", "lastName": "Doe", "address": { "street": "21 2nd Street", "city": "New York", "postalCode": "10021-3100", "coordinates": { "latitude": 40.7250387, "longitude": -73.9932568 } } }
Et considérez que vous souhaitez parsingr le nœud de coordinates
dans la classe Java suivante:
public class Coordinates { private Double latitude; private Double longitude; // Default constructor, getters and setters omitted }
Pour ce faire, parsingz l’ensemble du JsonNode
JSON dans un JsonNode
avec ObjectMapper
:
Ssortingng 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);
Utilisez ensuite le pointeur JSON pour interroger le nœud de coordinates
et utilisez ObjectMapper
pour l’parsingr dans la classe Coordinates
:
JsonNode coordinatesNode = node.at("/address/coordinates"); Coordinates coordinates = mapper.treeToValue(coordinatesNode, Coordinates.class);
JSON Pointer est un langage de chemin pour traverser JSON. Pour plus de détails, consultez le RFC 6901 . Il est disponible dans Jackson depuis la version 2.3.