Ответ 1
из GsonBuilder javadocs... вы можете использовать GsonBuilder
для создания своего экземпляра Gson
и выбрать нулевой значения сериализованы так:
Gson gson = new GsonBuilder()
.serializeNulls()
.create();
Я создал модель:
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"
}
Буду признателен за любую помощь в этой проблеме.
из GsonBuilder javadocs... вы можете использовать GsonBuilder
для создания своего экземпляра Gson
и выбрать нулевой значения сериализованы так:
Gson gson = new GsonBuilder()
.serializeNulls()
.create();
Не слишком знакомы с Gson, но я не думаю, что Gson записывал бы нулевые значения в json файл. Если вы инициализируете id следующим образом:
String id = "";
вы можете получить пустую строку. Но вы не получите нулевое значение в XML файл.
Пример того, как принудительно выводить значения, даже если 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;
}
}
}