Немного трудно решить точную проблему в первоначальном вопросе, поскольку полный минимальный код и примеры не были предоставлены.Возможно, поможет следующее понимание того, как Gson создает экземпляры целевых объектов во время десериализации.
Gson 1.7.1 и 2.0 оба учитывают окончательные назначения полей во время операций десериализации ванили, а начальные конечные назначения полей не изменяются.Например:
import com.google.gson.Gson;
public class GsonFoo
{
public static void main(String[] args)
{
// {"name":"Fred","id":42}
String json1 = "{\"name\":\"Fred\",\"id\":42}";
System.out.println(new Gson().fromJson(json1, Bar1.class));
// output:
// Bar1: name=Fred, id=-1
}
}
class Bar1
{
String name = "BLANK";
final int id = -1;
@Override
public String toString()
{
return String.format("Bar1: name=%s, id=%d", name, id);
}
}
С другой стороны, например, создание экземпляра во время десериализации, поскольку Gson использует sun.misc.Unsafe
- а не определяемый пользователем конструктор - присваивания конечных полей, явно определенных в любом конструкторе,не соблюдаетсяНапример:
import com.google.gson.Gson;
public class GsonFoo
{
public static void main(String[] args)
{
// {"name":"Fred","id":42}
String json1 = "{\"name\":\"Fred\",\"id\":42}";
System.out.println(new Gson().fromJson(json1, Bar1.class));
// output:
// Bar1: name=Fred, id=42
}
}
class Bar1
{
String name = "BLANK";
final int id;
Bar1()
{
id = -1;
}
@Override
public String toString()
{
return String.format("Bar1: name=%s, id=%d", name, id);
}
}
Таким образом, во время десериализации ванили невозможно переназначить окончательное присвоение поля любым данным из входящего JSON, хотя это может показаться возможным, если происходит окончательное присвоение поляв определяемом пользователем конструкторе. **
** Я не уверен, допускает ли спецификация JVM некоторую снисходительность реализации, так что при работе на разных JVM может наблюдаться поведение, отличное от описанного выше.