2017-05-19 1 views
-1

J'ai créé un modèle:Gson ignore mes champs lors de la conversion

public class UserRequest extends DefaultRequest { 
    public String username; 
    public String password; 
    public String id; 

    public UserRequest(String username, String password) { 
     this.username = username; 
     this.password = password; 
    } 
} 

Et je l'appeler comme:

//code truncated 

      UserRequest userRequest = new UserRequest(username,password); 
      response = getRestClient().sysInitApp(userRequest).execute(); 

//code truncated 

Et puis-je imprimer le corps de la demande, au lieu de:

{ 
"username":"farid", 
"password":"passfarid", 
"id":null 
} 

Je reçois:

{ 
"username":"farid", 
"password":"passfarid" 
} 

J'apprécierais n'importe quelle aide avec ce problème.

+2

Ceci est le comportement par défaut pour gson. https://sites.google.com/site/gson/gson-user-guide#TOC-Null-Object-Support – pvg

Répondre

3

des GsonBuilder javadocs ... vous pouvez utiliser GsonBuilder pour construire votre instance Gson, et d'opter pour des valeurs nulles sérialisé comme si:

Gson gson = new GsonBuilder() 
    .serializeNulls() 
    .create(); 
+0

@pvg, déjà souligné, et il a résolu mon problème. Quoi qu'il en soit, l'accepter comme il répond à ma question de manière appropriée;) – FARID

1

Pas trop familier avec Gson, mais je ne pense pas que Gson écrirait des valeurs nulles dans un fichier json. Si vous initialisez l'ID comme:

String id = ""; 

vous pouvez obtenir une chaîne vide là-dedans. Mais vous n'obtiendrez pas une valeur nulle dans un fichier .xml.

+0

Il est tout à fait correct d'obtenir '" "', mais je ne convertis pas ce champ en json. C'est le problème. – FARID

+0

Gson n'écrit pas de valeurs NULL dans le fichier. Donc, si c'est null, le champ n'est pas écrit. – Zoe

+0

Qui a mis bas, et pourquoi? – Zoe

0

Un exemple de la façon d'appliquer les valeurs en sortie même si nul . Il sortira la chaîne vide (ou "{}" si un objet) à la place de null et ignorera les transitoires:

package unitest; 

import java.io.IOException; 
import java.lang.reflect.Field; 
import java.lang.reflect.Modifier; 

import com.google.gson.Gson; 
import com.google.gson.GsonBuilder; 
import com.google.gson.TypeAdapter; 
import com.google.gson.TypeAdapterFactory; 
import com.google.gson.reflect.TypeToken; 
import com.google.gson.stream.JsonReader; 
import com.google.gson.stream.JsonToken; 
import com.google.gson.stream.JsonWriter; 

public class TheResponse<T> { 
    private String status; 
    private String message; 
    private T data; 
    transient private String resource; 

    public static void main(String[] args) { 

     TheResponse<String> foo = new TheResponse<String>(); 
     //TheResponse<Baz> foo = new TheResponse<Baz>(); 
     foo.status = "bar"; 
     foo.data = "baz"; 

     Gson gson = new GsonBuilder().registerTypeAdapter(TheResponse.class, new GenericAdapter()).create(); 

     System.out.println(gson.toJson(foo).toString()); 
    } 

    public static class GenericAdapter extends TypeAdapter<Object> { 
     @Override 
     public void write(JsonWriter jsonWriter, Object o) throws IOException { 
      recursiveWrite(jsonWriter, o); 
     } 

     private void recursiveWrite(JsonWriter jsonWriter, Object o) throws IOException { 
      jsonWriter.beginObject(); 
      for (Field field : o.getClass().getDeclaredFields()) { 
       boolean isTransient = Modifier.isTransient(field.getModifiers()); 
       if (isTransient) { 
        continue; 
       } 
       Object fieldValue = null; 
       try { 
        field.setAccessible(true); 
        fieldValue = field.get(o); 
       } catch (IllegalArgumentException e) { 
        e.printStackTrace(); 
       } catch (IllegalAccessException e) { 
        e.printStackTrace(); 
       } 
       jsonWriter.name(field.getName()); 
       if (fieldValue != null && fieldValue.getClass() != String.class) { 
        recursiveWrite(jsonWriter, fieldValue); 
        continue; 
       } 
       if (fieldValue == null) { 
        if (field.getType() == String.class) 
         jsonWriter.value(""); 
        else { 
         jsonWriter.jsonValue("{}"); 
        } 
       } else { 
        jsonWriter.value(fieldValue.toString()); 
       } 
      } 
      jsonWriter.endObject(); 
     } 

     @Override 
     public Object read(JsonReader jsonReader) throws IOException { 
      // todo 
      return null; 
     } 

    } 
}