2013-02-19 4 views
5

Meine Klasse:Wie verhindert man, dass Gson das erste Zeichen eines Feldes (Unterstrich) serialisiert/deserialisiert?

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

I wird wie folgt angezeigt werden soll:

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

und nicht wie diese

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

initialisieren ich den Parser wie folgt:

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

Ich konnte die API und in den documentation von „FieldNamePolicy“ sehen, aber ich bin überrascht, dass nicht die Möglichkeit geben, überspringen „_“ Ich weiß auch ich die Anmerkung verwenden kann ...

@ SerializedName (" custom_naming ") 

... aber ich möchte dies nicht für alllllll meine Felder schreiben müssen ...

Es ist sehr nützlich für mich, zwischen lokalen Variablen und Feldern einer Klasse zu unterscheiden. :(Jede Idee

EDIT:. würde es viele offensichtliche Lösungen, (Vererbung, Gson Überschreiben Methoden, regelmäßige expresions) Meine Frage ist, mehr auf, ob es eine native Lösung von Gson oder eine weniger aufdringliche fix ?

Vielleicht könnten wir als neuen FieldNamePolicy vorschlagen?

+0

Die Antwort erzeugt ist ... Konventionen richtige Java Namensgebung folgen und nicht Verwenden Sie Unterstriche. Und obwohl die JSON-Namenskonventionen dies zulassen, würden Sie selten jemanden finden, der PascalCase in JSON verwendet (was Ihre vorgeschlagene Ausgabe ist). Ihre andere Option verwendet '@ SerializedName' für jeden nicht übereinstimmenden Feldnamen. –

+0

Sie haben mir nichts gesagt, was ich nicht weiß. Ich und mein Team von Fachleuten, wir sind frei, die Sprachkonventionen zu wählen, denen wir mehr zustimmen. Vor allem, wenn wir verschiedene Technologien und Sprachen gleichzeitig integrieren. Wie auch immer, danke für deine Zeit. – enagra

+0

Dann sollten Sie und Ihr "Team von Fachleuten" bereit sein, sich mit den Problemen, die sich daraus ergeben, zu befassen, wie? Seltsamerweise war ich gerade dabei, eine Antwort zu tippen, die Ihnen zeigt, wie Sie dies mit einem benutzerdefinierten Gson JsonSerializer mithilfe von Reflektion erreichen können, wenn Sie kommentierten ...aber ich bin mir sicher, dass Sie das herausfinden werden, vorausgesetzt, Sie haben ein ganzes Team von Profis ... –

Antwort

11

GsonBuilder stellt ein Verfahren setFieldNamingStrategy(), dass Sie Ihre eigene FieldNamingStrategy Implementierung passieren läßt.

Beachten Sie, dass diese ersetzt den cal l bis setFieldNamingPolicy() - wenn Sie die Quelle für GsonBuilder betrachten, schließen sich diese beiden Methoden gegenseitig aus, da sie dasselbe interne Feld einstellen (Die FieldNamingPolicy enum ist eineFieldNamingStrategy).

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; 
    } 
} 

Ausgang:

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

danke brian! Das ist wirklich die großartige Lösung! – enagra

+0

Ich habe versucht, dies zu bearbeiten, so dass es kompiliert und funktioniert, aber die Bearbeitung wurde abgelehnt. Es gibt keine translateName() -Methode für FieldNamingPolicy. http://stackoverflow.com/review/suggested-edits/5997458 – Kirby

+0

@Kirby gibt es seit Version 1.3 https://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/ gson/FieldNamingStrategy.html – Justin

0

Was Sie wollen, ist

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; 
     } 
    } 
} 

die

{"FirstField":"example","SecondField":"bean"} 
Verwandte Themen