Создание строки JSON с использованием GSON
У меня есть класс вроде следующего,
public class Student {
public int id;
public String name;
public int age;
}
Теперь я хочу создать новый Student,
//while create new student
Student stu = new Student();
stu.age = 25;
stu.name = "Guna";
System.out.println(new Gson().toJson(stu));
Это дает мне следующий результат:
{"id":0,"name":"Guna","age":25} //Here I want string without id, So this is wrong
Итак, я хочу, чтобы String как
{"name":"Guna","age":25}
Если я хочу отредактировать старый Student
//While edit old student
Student stu2 = new Student();
stu2.id = 1002;
stu2.age = 25;
stu2.name = "Guna";
System.out.println(new Gson().toJson(stu2));
Теперь выход
{"id":1002,"name":"Guna","age":25} //Here I want the String with Id, So this is correct
Как я могу создать строку JSON с полем [В какой-то момент], без поля [в какой-то момент].
Любая помощь будет очень заметной.
Спасибо.
Ответы
Ответ 1
Лучше использовать аннотацию @expose, например
public class Student {
public int id;
@Expose
public String name;
@Expose
public int age;
}
И используйте метод ниже, чтобы получить строку Json из вашего объекта
private String getJsonString(Student student) {
// Before converting to GSON check value of id
Gson gson = null;
if (student.id == 0) {
gson = new GsonBuilder()
.excludeFieldsWithoutExposeAnnotation()
.create();
} else {
gson = new Gson();
}
return gson.toJson(student);
}
Он будет игнорировать столбец id, если он установлен в 0, либо он вернет строку json с полем id.
Ответ 2
Вы можете исследовать дерево json с помощью gson.
Попробуйте что-то вроде этого:
gson.toJsonTree(stu1).getAsJsonObject().remove("id");
Вы также можете добавить некоторые свойства:
gson.toJsonTree(stu2).getAsJsonObject().addProperty("id", "100");
Ответ 3
JsonObject jsObj = (JsonObject) new Gson().toJsonTree(stu2);
jsObj.remove("age"); // remove field 'age'
jsObj.addProperty("key", "value"); // add field 'key'
System.out.println(jsObj);
Вы можете манипулировать с помощью JsonObject
Ответ 4
Вы должны ввести дополнительное поле в класс Student
, который замечает GSON
о id
политике сериализации.
Затем вы должны реализовать собственный сериализатор, который будет реализовывать TypeAdapter
. В вашей реализации TypeAdapter
в соответствии с политикой сериализации id вы ее сериализуете или нет. Затем вы должны зарегистрировать свой TypeAdapter
в GSON factory:
GsonBuilder gson = new GsonBuilder();
gson.registerTypeAdapter(Student.class, new StudentTypeAdapter());
Надеюсь, что это поможет.
Ответ 5
У вас есть два варианта.
-
Используйте ключевое слово Java transient, которое указывает, что поле не должно быть сериализовано. Gson автоматически исключит его. Это может не сработать для вас, как вы хотите это условно.
-
Использовать аннотацию @Expose для нужных полей и инициализировать построитель Gson следующим образом:
Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
Итак, вам нужно пометить поля имени и возраста, используя @Expose, и вам нужно иметь два разных экземпляра Gson для стандартного, который включает все поля и выше, которые исключают поля без аннотации @Expose
.