Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Java对象到JSON对象的自定义转换_Java_Json_Hibernate_Gson - Fatal编程技术网

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

从Java对象到JSON对象的自定义转换,java,json,hibernate,gson,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} {creationTime:0, enabled:true, id:1, loginDurat

我有以下代码

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}
{creationTime:0, enabled:true, id:1, loginDuration:0, online:false, userName:someone, DT_RowId=1}
我想在JSON响应中添加新属性(DT_RowId,其值与id相同)。最终结果应该是这样的:

{creationTime:0, enabled:true, id:1, loginDuration:0, online:false, userName:someone}
{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自定义序列化程序/反序列化程序。提供一些例子说明如何做到这一点

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

Entity.java EntityJsonSerializer.java
感谢您提供的示例代码。我正在阅读文档并试图提出解决方案。有没有可能让它变得通用?@Abieez:不客气。在看了我发布的doc链接后,我意识到,如何让它工作起来,其实并不那么明显。所以我做了一些实验,这就是我想出来的,实际上是有效的。我想这是可以改进的。我建议发布一个新问题,说明如何最好地使解决方案符合您的需求。
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);
    }
}