使用GSON创建JSON字符串

时间:2014-10-28 10:18:57

标签: java android 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字符串,没有字段[在某些时候]。

任何帮助都会非常明显。

感谢。

5 个答案:

答案 0 :(得分:22)

更好的是使用@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,它将忽略id列,它将返回带有id字段的json字符串。

答案 1 :(得分:3)

您可以使用gson探索json树。

尝试这样的事情:

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

您还可以添加一些属性:

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

答案 2 :(得分:2)

您有两种选择。

  • 使用Java的transient关键字来表示不应该序列化字段。 Gson会自动将其排除在外。这可能不适合你,因为你有条件地想要它。

  • 将@Expose注释用于所需的字段,并按如下方式初始化Gson构建器:

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

因此,您需要使用@Expose标记名称和年龄字段,并且您需要为默认值设置两个不同的Gson实例,其中包括所有字段,上面的一个实例排除没有@Expose注释的字段。

答案 3 :(得分: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进行操作

答案 4 :(得分:2)

您应该向Student类引入其他字段,该字段会注意GSON有关id序列化策略的TypeAdapter。 然后,您应该实现将实现TypeAdapter的自定义序列化程序。在根据id序列化策略的TypeAdapter实现中,您将序列化它。然后你应该在GSON工厂注册你的GsonBuilder gson = new GsonBuilder(); gson.registerTypeAdapter(Student.class, new StudentTypeAdapter());

{{1}}

希望这有帮助。