web-dev-qa-db-ja.com

GSONを使用してJSON文字列を作成する

私は次のようなクラスを持っています、

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文字列を作成するにはどうすればよいですか。

どんな助けも高く評価されます。

ありがとう。

16
Gunaseelan

より良いのは、次のような@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文字列が返されます。

23
Pankaj Kumar

Gsonを使用してjsonツリーを探索できます。

このようなものを試してください:

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

いくつかのプロパティを追加することもできます:

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

2つのオプションがあります。

  • Javaの一時的なキーワードを使用します。これは、フィールドをシリアル化しないことを示すためのものです。 Gsonは自動的に除外します。条件に応じてこれが機能しない場合があります。

  • 必要なフィールドに@Exposeアノテーションを使用し、Gson Builderを次のように初期化します。

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

したがって、@ Exposeを使用して名前フィールドと年齢フィールドをマークする必要があり、すべてのフィールドを含むデフォルトと、@Exposeアノテーションのないフィールドを除外する上記の2つの異なるGsonインスタンスが必要です。

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を実装するカスタムシリアライザーを実装する必要があります。 idシリアル化ポリシーに従ったTypeAdapter実装では、シリアル化するかどうかを決定します。次に、TypeAdapterをGSONファクトリーに登録する必要があります。

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

お役に立てれば。

2
nndru