使用自定义字段</item>将List <item>序列化为JSON

时间:2014-03-21 14:55:11

标签: java json spring-mvc gson

我正在尝试使用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()agesomeUtilityClass.calcAge(author.getBirthDate())

我正试图弄清楚如何使用GSON获得这种输出。

我可以做的是从服务类获取数据并对其进行迭代,将每个迭代行保存到Map(或者某些东西,可能只是将每一行保存为List<AuthorJson>实体,其中包含类似的字段id, name, age)。但这种方法看起来并不是很干净。

你们可以提出任何解决方案吗?

1 个答案:

答案 0 :(得分:0)

您应该为作者使用自定义序列化程序。

Documentation

由于您只需要一个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;
    }
}