2

次のコードがあります

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 応答内に新しい属性 (id と同じ値を持つ DT_RowId) を追加したいと思います。最終結果は次のようになります。

{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 関数は呼び出されていません。誰かがこれについて私を啓発できますか?

4

1 に答える 1

3

GSON はゲッターとセッターを呼び出しません。リフレクションを介してメンバー変数に直接アクセスします。やろうとしていることを達成するには、GSON カスタム シリアライザー/デシリアライザーを使用する必要があります。カスタム シリアライザー/デシリアライザーに関する GSON ドキュメントには、これを行う方法の例がいくつか示されています。

以下は、その方法を示す 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);
    }
}
于 2012-11-01T13:54:57.317 に答える