这个
["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}}]}