これ
["student":{"name":"sam","rollNumer":1},"student":{"name":"tom","rollNumer":2}]
は有効な JSON ではありません ( jsonlintなどのオンライン ツールを使用して自分で確認できます)。JSON 仕様の詳細を参照してください。
オブジェクトの定義:
オブジェクトは、名前と値のペアの順序付けられていないセットです。オブジェクトは { (左中かっこ) で始まり、} (右中かっこ) で終わります。各名前の後には : (コロン) が続き、名前と値のペアは , (コンマ) で区切られます。
配列の定義:
配列は、順序付けられた値のコレクションです。配列は [ (左角括弧) で始まり、] (右角括弧) で終わります。値は、(コンマ) で区切られます。
値の定義:
値は、二重引用符で囲まれた文字列、数値、true、false、null、またはオブジェクトまたは配列にすることができます。これらの構造は入れ子にすることができます。
出力では JSON 配列が定義されていますが、その配列内のオブジェクトが中かっこで適切に囲まれていません。正しい表現は次のようになります。
[{"student":{"name":"sam","rollNumer":1}}, {"student":{"name":"tom","rollNumer":2}}]
これは、この単純な Gson で生成できますTypeAdapter
:
class StudentAdapter extends TypeAdapter<Student> {
@Override
public void write(final JsonWriter writer, final Student student)
throws IOException {
if (student == null) {
writer.nullValue();
return;
}
writer.beginObject();
writer.name("student");
writer.beginObject();
writer.name("name");
writer.value(student.getName());
writer.name("rollNumber");
writer.value(student.getRollNumber());
writer.endObject();
writer.endObject();
}
@Override
public Student read(final JsonReader reader) throws IOException {
if (reader.peek() == JsonToken.NULL) {
reader.nextNull();
return null;
}
final Student student = new Student();
reader.beginObject();
reader.nextName(); // discard the 'student' wrapper property
reader.beginObject();
while (reader.hasNext()) {
final String attrName = reader.nextName();
if ("name".equals(attrName)) {
student.setName(reader.nextString());
} else if ("rollNumber".equals(attrName)) {
student.setRollNumber(reader.nextInt());
}
}
reader.endObject();
reader.endObject();
return student;
}
}
試験方法:
@Test
public void testWriteSchoolsAsJSONWithGsonAndCustomOutput()
throws Exception {
final Gson gson = new GsonBuilder().registerTypeAdapter(Student.class,
new StudentAdapter()).create();
Student[] students = new Student[2];
students[0] = new Student("sam", 1);
students[1] = new Student("tom", 2);
School school = new School(students);
final String outputJson = gson.toJson(school);
System.out.println(outputJson);
school = gson.fromJson(outputJson, School.class);
System.out.println(school);
}
そして「関連する」出力:
{"students":[{"student":{"name":"sam","rollNumber":1}},{"student":{"name":"tom","rollNumber":2}}]}