2011-10-27 7 views
7

J'ai une classe qui a plus d'une douzaine de propriétés. Pour la plupart des propriétés de type primitif, j'espère utiliser le BeanSerializer et le BeanDeserializer par défaut ou quoi que ce soit pour réduire le code encombrant que j'ai besoin d'écrire. Pour les autres propriétés de type custom et array, je souhaite faire un sérialiseur/désérialiseur personnalisé. Notez que je ne suis pas en mesure de modifier la chaîne JSON sous-jacente. Mais j'ai un accès complet au code android. J'utilise Jackson 1.7.9/Ektorp 1.1.1.Comment écrire un sérialiseur et un désérialiseur personnalisés dans Jackson?

dois-je sous-classer BeanDeserializer? J'ai des problèmes avec ça. Il attend un constructeur par défaut sans paramètres mais je ne sais pas comment appeler le super constructeur.

class MyType{ 
    // a dozen properties with primitive types String, Int, BigDecimal 
    public Stirng getName(); 
    public void setName(String name); 

    // properties that require custom deserializer/serializer 
    public CustomType getCustom(); 
    public void setCustom(CustomType ct); 
} 

class MyDeserializer extends BeanDeserialzer{ 
    // an exception is throw if I don't have default constructor. 
    // But BeanDeserializer doesn't have a default constructor 
    // It has the below constructor that I don't know how to fill in the parameters 
    public MyDeserializer(AnnotatedClass forClass, JavaType type, 
     BeanProperty property, CreatorContainer creators, 
     BeanPropertyMap properties, 
     Map<String, SettableBeanProperty> backRefs, 
     HashSet<String> ignorableProps, boolean ignoreAllUnknown, 
     SettableAnyProperty anySetter) { 
    super(forClass, type, property, creators, properties, backRefs, ignorableProps, 
      ignoreAllUnknown, anySetter); 
} 
    @Override 
    public Object deserialize(JsonParser jp, DeserializationContext dc, Object bean) 
     throws IOException, JsonProcessingException { 
    super.deserialize(jp, dc, bean); 
     MyType c = (MyType)bean;   

      ObjectMapper mapper = new ObjectMapper(); 

      JsonNode rootNode = mapper.readValue(jp, JsonNode.class); 
      // Use tree model to construct custom 
      // Is it inefficient because it needs a second pass to the JSON string to construct the tree? 
      c.setCustom(custom); 
      return c; 
} 
} 

J'ai effectué une recherche sur Google, mais je n'ai trouvé aucun exemple/tutoriel utile. Si quelqu'un peut m'envoyer des exemples de travail, ce serait génial! Merci!

Répondre

4

Pour la sous-classe BeanSerializer/-Deserializer, il serait préférable d'utiliser une version plus récente de Jackson, car cette zone a été améliorée avec un support explicite via BeanSerializerModifier et BeanDeserializerModifier, ce qui peut altérer la configuration des instances.

Mais juste pour vous assurer, vous pouvez également spécifier sérialiseur/désérialiseur personnalisé pour être utilisé uniquement sur des propriétés individuelles, comme ceci:

class Foo { 
    @JsonSerialize(using=MySerializer.class) 
    public OddType getValue(); 
} 
+0

Merci pour l'idée! Je vais essayer pour voir si cela fonctionne. J'utilise Ektorp pour Android et ils suggèrent 1.1.1, c'est pourquoi j'utilise Jackson 1.7.9. Mais cela pourrait fonctionner si je fais une mise à jour. –

+0

la version la plus élevée que je peux aller est 1.8.5. Toute suggestion? Je vais essayer votre idée JsonSerializer sur OddType. –

+0

1.8 a une meilleure capacité d'overridability que 1.7 ainsi cela pourrait réellement fonctionner. En utilisant BeanSerializerModifier, vous n'avez pas besoin de surcharger BeanSerializer, mais vous pouvez également créer des instances personnalisées, tout en reportant les autres paramètres aux paramètres par défaut. De plus, vos sérialiseurs personnalisés peuvent rechercher ceux par défaut dans la méthode 'resolve()' (si vous implémentez ResolvableSerializer, comme BeanSerializer le fait). Idéalement, vous éviterez de sous-classer BeanSerializers si possible, juste pour la simplicité; mais si vous avez besoin de sous-classer, c'est aussi une technique supportée. – StaxMan

Questions connexes