java - 从 Java 对象到 JSON 对象的自定义转换

标签 java json hibernate gson

我有以下代码

Gson gson = new Gson();
String json = gson.toJson(criteria.list()); // list is passed by Hibernate

结果会是这样的:

{creationTime:0, enabled:true, id:1, loginDuration:0, online:false, userName:someone}

我想在 JSON 响应中添加新属性(DT_RowId,其值与 id 相同)。最终结果应该是这样的:

{creationTime:0, enabled:true, id:1, loginDuration:0, online:false, userName:someone, DT_RowId=1}

已更新

为了解决这个问题,我在实体上创建了一个带有 @Transient 注释的字段。

    ...
    @Transient
    private long DT_RowId;

    public void setId(long id) {
            this.id = id;
            this.DT_RowId=id;
        }
    ...

但是 setId 函数从未被调用过。有人可以告诉我这个吗?

最佳答案

GSON 不会调用您的 getter 和 setter。它通过反射直接访问成员变量。为了完成您想要做的事情,您将需要使用 GSON 自定义序列化器/反序列化器。 The GSON docs on custom serializers/deserializers提供一些示例来说明如何执行此操作。

下面是一个通过 JUnit 测试的工作示例,演示了如何执行此操作:

Entity.java

public class Entity {
    protected long creationTime;
    protected boolean enabled;
    protected long id;
    protected long loginDuration;
    protected boolean online;
    protected String userName;
    protected long DT_RowId;
}

EntityJsonSerializer.java

import java.lang.reflect.Type;
import com.google.gson.*;

public class EntityJsonSerializer implements JsonSerializer<Entity> {
    @Override
    public JsonElement serialize(Entity entity, Type typeOfSrc, JsonSerializationContext context) {
       entity.DT_RowId = entity.id;
       Gson gson = new Gson();
       return gson.toJsonTree(entity);
    }
}

JSONTest.java

import static org.junit.Assert.*;
import org.junit.Test;
import com.google.gson.*;

public class JSONTest {
    @Test
    public final void testSerializeWithDTRowId() {
        Entity entity = new Entity();
        entity.creationTime = 0;
        entity.enabled = true;
        entity.id = 1;
        entity.loginDuration = 0;
        entity.online = false;
        entity.userName = "someone";

        GsonBuilder builder = new GsonBuilder();
        builder.registerTypeAdapter(Entity.class, new EntityJsonSerializer());
        Gson gson = builder.create();
        String json = gson.toJson(entity);
        String expectedJson = "{\"creationTime\":0,\"enabled\":true,\"id\":1,\"loginDuration\":0,\"online\":false,\"userName\":\"someone\",\"DT_RowId\":1}";
        assertEquals(expectedJson, json);
    }
}

关于java - 从 Java 对象到 JSON 对象的自定义转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13175019/

相关文章:

javascript - 在 Javascript 中更改 JSON 对象格式

hibernate - 如何在 Hibernate 中使用 BLOB 数据类型?

java - 分段上传 Servlet 3.0 - 临时文件不删除

java - 枚举 Java 字段

json - 如何使用 postgres 在 jsonb 数据中找到最小值?

python - 如何使用dictionary/json在yaml中添加 '-'?

java - 如何将当前日期时间的格式设置为不同的格式?

java - 为什么外键的值总是为零?

java - 模拟的GUI渲染

java - Spring框架Web套接字独特的@SendTo注释