2017-08-27 4 views
1

J'ai un ObjectMapper Jackson avec un désérialiseur personnalisé pour java.time.Instant (et d'autres types). Comment puis-je lire une valeur unique au lieu d'un blob JSON complet, par ex.Jackson - désérialiser une valeur unique avec les désérialiseurs de Jackson

objectMapper.readValue("2017-02-01T00:00:00Z", Instant.class) 

Précisions en réponse aux commentaires demandant un cas d'utilisation:

Je l'ai déjà analysé le JSON dans

class MyConfiguration { 
    public Instant someField; 
    public Map<String, String> otherFields; 

    @JsonAnyGetter 
    public Map<String, String> any() { 
     return otherFields; 
    } 

    @JsonAnySetter 
    public void set(String name, String value) { 
     otherFields.put(name, value); 
    } 
} 

Maintenant, j'ai:

interface Something { 
    void init(MyConfiguration config) 
} 

class Something2 implements Something { 
    public void init(MyConfiguration config) { 
     //Here I would be like the implementation to be able to 
     //get a value from otherFields deserialised to a specified type. 
    } 
} 

Je suis conscient que je pouvais les cartographier directement en utilisant @JsonSubTypes mais j'essaie de rendre le système extensible et ignorant les implémentations.

+1

Quelle est la pour ce cas d'utilisation? Cela n'a pas beaucoup de sens d'utiliser une bibliothèque JSON si vous n'avez pas JSON. Il suffit d'utiliser https://docs.oracle.com/javase/8/docs/api/java/time/Instant.html#parse-java.lang.CharSequence- – pedromss

+0

@pedromss J'analyse un fichier YAML pour une configuration qui a certaines propriétés dynamiques (une carte ) et j'essaie de laisser différentes implémentations d'une interface tirer les propriétés avec un type spécifique, par exemple ' T getProperty (Chaîne prop, Carte carte, Classe clazz)' – bcoughlan

+1

Je suis toujours confus. Vous avez du JSON, et vous voulez extraire du champ et désérialiser seulement cela? –

Répondre

0

répondre à ma propre question, utilisez convertValue sur le ObjectMapper construit:

objectMapper.convertValue("2017-10-02T01:02:03Z", Instant.class)