Технический ответ
Если вы присоедините исходный код Gson, а затем отладите программу, вы найдете источник проблемы.Кажется, проблема заключается в коде Gson.
Поскольку значение имеет тип Object, к которому вы обращаетесь из fromJson (), будет использоваться класс com.google.gson.ObjectNavigator, который входит в этот раздел кода [~ строка 113]
else if (objTypePair.type == Object.class && isPrimitiveOrString(objectToVisit)) {
visitor.visitPrimitive(objectToVisit); //Target value is the proper value after this call
visitor.getTarget(); //target value is now a blank Object.
где посетитель имеет тип JSonObjectDeserializationVisitor, objectToVisit - это ваше значение, а objectTypePair - это тип, которым он должен стать (Object).
Теперь у JsonObjectDeserializationVisitor есть флагВызывается построенный, который по умолчанию имеет значение false.поэтому, когда вызывается метод getTarget (), он проверяет, является ли созданный флаг истинным, если нет, то создает новый экземпляр объекта, который вы пытаетесь создать.поскольку созданный флаг никогда не устанавливается, вызов getTarget () возвращает пустой объект.
Вызов getTarget () в коде кажется ненужным и, по-видимому, является источником проблемы.visitPrimitive выполняет правильное действие, помещая проанализированное значение в целевую переменную, которая будет передана обратно.Похоже, это ошибка, связанная с типом объекта.
Это не то, что вы можете исправить, если не хотите делать пользовательскую сборку Gson.Я бы порекомендовал подать это в виде отчета на форумах Gson.Уже один отчет подан для версии 1.5
Обход
Я вижу два способа исправить это в краткосрочной перспективе.
1) Создайте карту типа <String, String>
, хотя вы потеряете типы, вы все равно сможете вернуть значения должным образом
2) Сначала поместите значения в класс компонента, а затем сериализуйте его..
public class myObj{
String myStr;
int myInt;
boolean myBool;
//get and set methods
}
public static void main(String args[]){
MyObj o = new MyObj();
o.setMyStr("str-value");
Gson gson = new Gson();
String json = gson.toJson(o);
o = gson.fromJson(json, MyObj.class);
}
Оба побеждают цель того, что вы пытаетесь сделать, но, как я полагаю, исправление этой ошибки происходит в суде гуглов.