Создание строки 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.