2017-07-25 3 views
2

Dire que j'ai sérialisé l'objet suivant en tant que chaîne JSON:Gson transformer un champ en plusieurs champs

class Person { 
    public final String name; 
    public Person(String name) { this.name = name; } 
} 

Person p = new Person("Bob Falaway"); 
JsonObject json = gson.toJsonTree(p, Person.class).getAsJsonObject(); 

Maintenant, je veux désérialiser, mais je veux diviser diviser le nom en deux champs, firstName et lastName . Comment puis-je faire cela?

Je veux la fin de résultat dans une classe similaire à:

class RefinedPerson { 
    public final String firstName; 
    public final String lastName; 

    public String toString() { return String.format("%s %s", firstName, lastName); } 
} 

Est-ce la mesure du possible avec Gson?

Répondre

2

Enregistrez votre propre JsonSerializer pour le type (ou TypeAdapter si vous préférez)?

Quelque chose comme:

@JsonAdapter(PersonSerializer.class) 
class Person { 
    private final String name; 
    Person(final String name) { 
     // Some validation... 
     this.name = name; 
    } 

    String getName() { 
     return this.name; 
    } 
} 

Si votre sérialiseur ressemble à:

class PersonSerializer implements JsonSerializer<Person> { 
    @Override 
    public JsonObject serialise(final Person src, 
           final Type personType, 
           final JsonSerializationContext context) { 

     final JsonObject json = new JsonObject(); 
     final String[] names = src.getName().split(" "); 
     // Some validation... 

     json.addProperty("firstName", names[0]); 
     json.addProperty("lastName", names[1]); 
     return json; 
    } 
}