2014-10-28 4 views
11

Я имею класс как следующий,Создание JSON строки с помощью GSON

public class Student { 
    public int id; 
    public String name; 
    public int age;  
} 

Теперь я хочу, чтобы создать новый студент,

//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 

Итак, здесь я хочу, чтобы строка как

{"name":"Guna","age":25} 

Если я хочу изменить старый студент

//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 строку с полем [На какой-то момент], без поля [в какой-то пункт].

Любая помощь будет очень заметной.

Спасибо.

+0

Когда вы объявляете переменную int, ее значение по умолчанию равно 0. Значение int не может быть нулевым. Поэтому я советую вам использовать String или игнорировать значение id, если оно равно 0. – joao2fast4u

+0

@ joao2fast4u Я отредактировал мой код friend – Gunaseelan

+0

@Gunaseelan Проверьте мой ответ для лучшего решения. Вам не нужно удалять ключ после создания json. –

ответ

16

Лучше использовать @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); 
} 

проигнорирует Идентификатор столбца, если это установлено в 0, либо он вернет строку json с полем id.

+0

Да, я думаю, что это лучший ответ. Спасибо bro – Gunaseelan

+0

Вы больше всего приветствуете :) –

3

Вы можете изучить дерево json с помощью gson.

попробовать что-то вроде этого:

gson.toJsonTree(stu1).getAsJsonObject().remove("id"); 

Вы можете добавить некоторые свойства также:

gson.toJsonTree(stu2).getAsJsonObject().addProperty("id", "100"); 
1

У вас есть два варианта.

  • Используйте ключевое слово переходного периода Java, которое указывает, что поле не должно быть сериализовано. Gson автоматически исключит его. Это может не сработать для вас, как вы этого хотите.

  • Использование @Expose аннотаций для полей, которые вы хотите и инициализировать Gson строитель следующим образом:

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

Так что вам нужно, чтобы отметить имя и возраст полей с помощью @Expose и вам нужно чтобы иметь два разных экземпляра Gson для стандартного, который включает в себя все поля и выше, который исключает поля без аннотации @Expose.

2
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

2

Вы должны ввести дополнительное поле для Student класса, который заметит GSON о id политики сериализации. Затем вы должны реализовать пользовательский сериализатор, который будет реализовывать TypeAdapter. В вашей реализации TypeAdapter в соответствии с политикой сериализации id вы ее сериализуете или нет.Тогда вам необходимо зарегистрировать TypeAdapter в GSON заводе:

GsonBuilder gson = new GsonBuilder(); 
gson.registerTypeAdapter(Student.class, new StudentTypeAdapter()); 

Надеется, что это помогает.

Смежные вопросы