2013-02-19 13 views
5

La mia classe:Come impedire a Gson di serializzare/deserializzare il primo carattere di un campo (trattino basso)?

class ExampleBean { 
    private String _firstField; 
    private String _secondField; 
    // respective getters and setters 
} 

voglio apparire come segue:

{ 
    "FirstField":"value", 
    "SecondField":"value" 
} 

E non come questo

{ 
    "_FirstField":"value", 
    "_SecondField":"value" 
} 

inizializzo il parser come segue:

GsonBuilder builder = new GsonBuilder(); 
    builder.setDateFormat(DateFormat.LONG); 
    builder.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE); 
    builder.setPrettyPrinting(); 
    set_defaultParser(builder.create()); 

ho potuto vedere i API e nel documentation di "FieldNamePolicy" Ma io sono sorpreso che non dà la possibilità di saltare "_" so anche che posso usare l'annotazione ...

@ SerializedName (" custom_naming ") 

... ma non voglio dover scrivere questo per tutti i miei campi ...

È molto utile per me distinguere tra variabili locali e campi di una classe. :(Qualsiasi idea

EDIT:?. Ci sarebbero molte soluzioni ovvie, (eredità, GSON sovrascrivendo i metodi, esprimono tutti regolari) La mia domanda è più focalizzato sul fatto che v'è una soluzione nativa di GSON o di una correzione meno intrusivo ?

Forse si potrebbe proporre come nuovo FieldNamePolicy?

+0

La risposta è ... Osservare le corrette le convenzioni di denominazione di Java e non lo fanno utilizzare caratteri di sottolineatura. E anche se le convenzioni di denominazione JSON lo consentono, raramente si trova qualcuno che utilizza PascalCase in JSON (che è l'output proposto). L'altra opzione utilizza '@ SerializedName' per ogni nome di campo non corrispondente. –

+0

Non mi hai detto niente che non so. Io e il mio team di professionisti, siamo liberi di scegliere le convenzioni linguistiche che siamo più d'accordo. Soprattutto quando stiamo integrando contemporaneamente diverse tecnologie e lingue. Comunque, grazie per il tuo tempo. – enagra

+0

Allora tu e il tuo "team di professionisti" dovreste essere preparati ad affrontare i problemi che ne derivano, eh? Stranamente ero in realtà nel bel mezzo di digitare una risposta che mostra come si può effettivamente realizzare questo con un Gson JsonSerializer personalizzato utilizzando la riflessione quando hai commentato ...ma sono sicuro che lo capirai, visto che hai un intero team di professionisti ... –

risposta

11

GsonBuilder fornisce un metodo setFieldNamingStrategy() che permette di passare il proprio FieldNamingStrategy implementazione.

si noti che questo sostituisce il cal l a setFieldNamingPolicy() - se si guarda la fonte per GsonBuilder questi due metodi si escludono a vicenda poiché impostano lo stesso campo interno (L'FieldNamingPolicy enum è unFieldNamingStrategy).

public class App 
{ 
    public static void main(String[] args) 
    { 
     Gson gson = new GsonBuilder() 
         .setFieldNamingStrategy(new MyFieldNamingStrategy()) 
         .setPrettyPrinting() 
         .create(); 

     System.out.println(gson.toJson(new ExampleBean())); 
    } 
} 

class ExampleBean 
{ 

    private String _firstField = "first field value"; 
    private String _secondField = "second field value"; 
    // respective getters and setters 
} 

class MyFieldNamingStrategy implements FieldNamingStrategy 
{ 
    public String translateName(Field field) 
    { 
     String fieldName = 
      FieldNamingPolicy.UPPER_CAMEL_CASE.translateName(field); 
     if (fieldName.startsWith("_")) 
     { 
      fieldName = fieldName.substring(1); 
     } 
     return fieldName; 
    } 
} 

uscita:

{ 
    "FirstField": "first field value", 
    "SecondField": "second field value" 
} 
+0

grazie brian! Questa è davvero la soluzione migliore! – enagra

+0

Ho tentato di modificarlo in modo che compili e funzioni, ma la modifica è stata rifiutata. Non esiste un metodo translateName() su FieldNamingPolicy. http://stackoverflow.com/review/suggested-edits/5997458 – Kirby

+0

@Kirby ci sono, dalla versione 1.3 https://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/ gson/FieldNamingStrategy.html – Justin

0

Quello che vuoi è

import java.lang.reflect.Field; 
import java.text.DateFormat; 

import com.google.gson.FieldNamingStrategy; 
import com.google.gson.Gson; 
import com.google.gson.GsonBuilder; 

public class GsonExample { 

    public static void main(String... args) throws Exception { 
     final GsonBuilder builder = new GsonBuilder(); 
     builder.setDateFormat(DateFormat.LONG); 
     builder.setPrettyPrinting(); 
     builder.setFieldNamingStrategy(new FieldNamingStrategy() { 
      @Override 
      public String translateName(Field f) { 
       String fieldName = f.getName(); 
       if(fieldName.startsWith("_") && fieldName.length() > 1) { 
        fieldName = fieldName.substring(1, 2).toUpperCase() + fieldName.substring(2); 
       } 
       return fieldName; 
      } 
     }); 
     final Gson gson = builder.create(); 
     System.out.println(gson.toJson(new ExampleBean("example", "bean"))); 
    } 


    private static class ExampleBean { 
     private final String _firstField; 
     private final String _secondField; 

     private ExampleBean(String _firstField, String _secondField) { 
      this._firstField = _firstField; 
      this._secondField = _secondField; 
     } 
    } 
} 

che genera

{"FirstField":"example","SecondField":"bean"} 
Problemi correlati