Gson игнорирует мои поля при преобразовании

Я создал модель:

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

И я называю это как:

//code truncated

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

//code truncated

И затем я распечатываю тело запроса, а не:

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

Я получаю:

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

Буду признателен за любую помощь в этой проблеме.

Ответ 1

из GsonBuilder javadocs... вы можете использовать GsonBuilder для создания своего экземпляра Gson и выбрать нулевой значения сериализованы так:

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

Ответ 2

Не слишком знакомы с Gson, но я не думаю, что Gson записывал бы нулевые значения в json файл. Если вы инициализируете id следующим образом:

String id = "";

вы можете получить пустую строку. Но вы не получите нулевое значение в XML файл.

Ответ 3

Пример того, как принудительно выводить значения, даже если null. Он выведет пустую строку (или "{}" если объект "вместо нуля и игнорирует переходные процессы:

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

    }
}