我正在尝试使用Spring MVC创建一个简单的REST API,它以JSON格式返回数据。
我正在研究一个返回作者列表的方法,可以从example.com/api/authors?find=somename
访问我有一个名为Authors的JPA实体。我有一个@Service
来获取List<Author>
集合。 Author
实体具有属性,例如id, firstName, lastName, birthDate
。
我想要实现的是我的JSON结果如下:
{
"data": [
{
"id": 1,
"name": "Leo Tolstoi",
"age": 49
},
{
"id": 2,
"name": "Billy Shakespeare",
"age": 32
}
]
}
如您所见,结果有2个字段不是直接来自实体,而是应该从Author
实体的值生成。 name
字段为author.getFirstName() + " " + author.getLastName()
,age
为someUtilityClass.calcAge(author.getBirthDate())
我正试图弄清楚如何使用GSON获得这种输出。
我可以做的是从服务类获取数据并对其进行迭代,将每个迭代行保存到Map(或者某些东西,可能只是将每一行保存为List<AuthorJson>
实体,其中包含类似的字段id, name, age
)。但这种方法看起来并不是很干净。
你们可以提出任何解决方案吗?
答案 0 :(得分:0)
您应该为作者使用自定义序列化程序。
由于您只需要一个Serializer,以下是您可以做的一个示例。请注意,大部分时间年龄都会偏离。
public static void main(String[] args) {
GsonBuilder gBuild = new GsonBuilder();
gBuild.registerTypeAdapter(Author.class, new AuthorSerializer());
Author author = new Author();
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 1988);
cal.set(Calendar.MONTH, 1);
cal.set(Calendar.DAY_OF_MONTH, 1);
author.setBirthDate(cal);
author.setFirstName("John");
author.setLastName("Smith");
Gson gson = gBuild.setPrettyPrinting().create();
System.out.println(gson.toJson(author));
}
private static class AuthorSerializer implements JsonSerializer<Author> {
@Override
public JsonElement serialize(Author src, Type typeOfSrc, JsonSerializationContext context) {
Calendar today = Calendar.getInstance();
int age = today.get(Calendar.YEAR) - src.getBirthDate().get(Calendar.YEAR);
String fullName = src.getFirstName() + " " + src.getLastName();
JsonObject obj = new JsonObject();
obj.addProperty("fullName", fullName);
obj.addProperty("age", age);
return obj;
}
}