2012-11-02 7 views
2

Я прочитал кучу разных статей, сравнений и учебников, которые используют разные JSON-библиотеки для разбора (и создания) JSON в Java-объектах. В любом случае, я думаю, что у меня есть факты, потому что я решил использовать библиотеку JSON под названием Jackson.Android JSON Parsing (Jackson)

GSON прост и прочен, но способ замедлить работу со мной. Поэтому я решил попробовать эту вещь Джексона, но похоже, что синтаксический анализ здесь немного запутаннее, чем с GSON.

Тип данных, который я хочу проанализировать, - это просто Boolean.

Это то, что JSON, что я пытаюсь разобрать выглядит следующим образом:

{"FooResult":true} 

Так что я на самом деле нужна помощь в выборе значения из ключа FooResult, а затем разобрать его значение в Boolean.

Это то, что я сделал до сих пор:

String json = getString(request); 
ObjectMapper mapper = new ObjectMapper(); 
mapper.readValue(json, Boolean.class); 

Но этот код, очевидно, дает мне, я не выбрали, что это FooResult ключ, который я заинтересован в чтении причину неисправности & парсинг в буле.

+0

mapper.readValue (json, Boolean.class); - Это не сработает, потому что JSON не представляет собой логический тип/значение. JSON - это объект с единственным свойством, и это свойство является булевым (или булевым) значением типа. –

ответ

5

Вы должны создать новый класс, как это:

class MyClass { 
    public boolean FooResult; 
} 

И использовать этот код для загрузки данных:

MyClass myObject = mapper.readValue(json, MyClass.class);

Затем вы можете получить доступ к значению с myObject.FooResult

+0

К сожалению, это не работает. Я получаю JsonMappingException, которые говорят мне, что библиотека Джексона не может десериализовать объект для меня как Bean. – parek

+1

Ответ Саймона правильный. Обратите внимание: нет необходимости определять поле FooResult в качестве открытого участника. –

+0

Да, на самом деле это даже работает, чтобы определить его как частный член, благодаря Джексону, использующему Reflection для чтения/записи значений. Я обычно помещаю эти классы в свои собственные файлы Java, но использование static, как показано в приведенном ниже примере @Parek, также может работать. –

0

Хорошо, это хромает. Даже ламер, когда я задумываюсь об этом. Проблема все время заключалась в том, что класс объекта, который вы хотите проанализировать, должен быть static. Я пробовал то, что Саймон предложил как четыре или пять раз, прежде чем я даже разместил этот вопрос сегодня, но проблема все время состояла в том, что класс не был статическим.

Итак, теперь он наконец-то работает.

static class FooClass 
{ 
    public boolean FooResult; 
} 

И для процесса синтаксического анализа.

String json = getString(request); 
ObjectMapper mapper = new ObjectMapper(); 
FooClass fooClass = null; 
try 
{ 
    fooClass = mapper.readValue(json, FooClass.class); 
} 
boolean result = fooClass.FooResult; 
+2

«класс объекта, который вы хотите проанализировать, должен быть статичным» - это неверно. Я предполагаю, что вы объявляете целевой класс внутренним классом чего-то другого. Возможно, вам просто нужно переместить объявление класса FooClass за пределы объявления какого-либо другого класса. Насколько я помню, Gson действительно справляется с сериализацией внутреннего класса (de) несколько иначе, чем с Джексоном. Итак, возможно, поэтому решение Gson, которое у вас было, не работает точно так же, как с Джексоном. –

+0

FWIW, причина, по которой нестатические внутренние классы не работают, заключается в том, что они должны получить ссылку на экземпляр окружающего класса («неявный этот указатель»). И это обычно не доступно во время десериализации; по крайней мере, в вашем примере нет окружения POJO. Теоретически можно заставить его работать, передав «null» как родительскую ссылку, я думаю ... что может вызвать другие нечетные проблемы, но, по крайней мере, десериализовать. – StaxMan