2015-07-22 4 views
0

Итак, у меня есть String, являющийся результатом метода toJson, который я реализовал в классе, и подтвердил в своем тестовом коде, что это правильное представление Json моего класса. Моя цель - превратить эту String в JsonObject и передать ее конструктору, используя Gson. Однако я столкнулся с нечетной проблемой.Gson fromJson возвращает пустой JsonObject

Это код, который я звоню:

Gson gson = new Gson(); 
JsonObject jObj = gson.fromJson(jsonString, JsonObject.class); 

Я использовал буквально это точно такой же фрагмент кода, прежде чем во многих местах в моем проекте, для других классов, и она работала отлично. Я даже скопировал один из этих функциональных фрагментов кода в этот тестовый класс и попробовал его. Тем не менее, каждая версия, которую я пытаюсь получить, дает одно и то же: jObj - пустой набор скобок.

Я не понимаю, как это происходит. Я подтвердил, что у jsonString есть все поля, в которых это необходимо. Почему Gson возвращает пустой JsonObject? Никакие исключения не бросаются.

+3

Что такое содержимое jsonString, когда вы получаете пустой JsonObject? –

+0

строка "{" varName ": 1," otherVarName ": 2," thirdVarName ": 3.4}" и так далее. Типичный объект Json –

+1

Он работает для меня, я получил ожидаемый результат. Пожалуйста, покажите небольшую программу, демонстрирующую проблему. –

ответ

0

Из вашего комментария, который говорит, что строка {"varName":1, "otherVarName":2, "thirdVarName":3.4}, выглядит как сериализованный объект Map. Вы, возможно, потребуется указать тип маркера:

gson.fromJson(jsonString, new TypeToken<Map<K,V>>() {}.getType()); 

где K и V являются ключ и значение типа карты. Если это не Map, укажите любой класс, из которого была получена jsonString.

+0

Не знаете, откуда вы берете карту или читателя? –

+0

@ Чистый проект - я считаю, что вы абсолютно правы. Чтобы уточнить: https://sites.google.com/site/gson/gson-user-guide#TOC-Serializing-and-Deserializing-Generic-Types – paulsm4

+0

@MichaelHubbard: добавлено объяснение, а ссылка, опубликованная paulsm4, объясняет это в подробно. –

0

Для моего случая я случайно использовал следующий инициализатор в модуле кинжала.

Gson gson = new GsonBuilder() 
    .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) 
    .create() 

Я удалил setFieldNamingPolicy, и она работала.

1

Хорошо, поэтому я знаю, что это немного старо, но у меня была такая же точная проблема. В разрешении был изменен файл jar. У меня был аналогичный пример кода, работающий в другом проекте, но затем я столкнулся с одной и той же проблемой в другой. Ну, проблема была старше gson-2.1.jar. Обновлено приложение проблемы к соответствующему gson-2.3.1.jar, и все работало. Надеюсь это поможет.

+0

Обновление для 2.3.1 работало для меня. – claytronicon

Смежные вопросы