Intereting Posts
Не удалось создать задачу или введите checkenv Причина Имя не определено Android – менеджер уведомлений, имеющий уведомление без намерения Использование библиотеки дизайна Google, как скрыть кнопку FAB в прокрутке вниз? Как получить эффект ряби на элементах меню на моей настраиваемой панели инструментов? Точки останова и исключения перестали нормально работать, xamarin android Android Honeycomb: NetworkOnMainThreadException даже при использовании AsyncTask и без строгого режима? ANDROID: идентификатор электронной почты получателя электронной почты электронной почты пуст в андроид-синтаксисе Элементы элементов Android в виде трех точек Динамический TextView на ActionBar Android: Как предотвратить масштабирование изображения в ImageView или ImageButton? Как некоторые приложения для Android становятся больше, чем рекомендуемые значки? ClassCastException при получении пользовательского представления Android FragmentStatePagerAdapter возвращает пустой экран при перезагрузке срединных фрагментов Сообщение Android GCM успешно отправлено, но не получено Android record square Video

Jackson ObjectMapper с произвольными ключами JSON

Я использую Jackson 1.9.5 в Android-проекте для разбора файлов JSON.

До сих пор у меня не было никаких проблем, и можно отлично разбирать файлы, используя следующий код:

AssetManager mgr = getAssets(); ObjectMapper mapper = new ObjectMapper(); try { InputStream ifp = mgr.open("detail_schema.json"); schema = mapper.readValue(ifp, DetailSchema.class); } catch (IOException e) { e.printStackTrace(); } 

Где класс DetailSchema состоит из сочетания примитивных типов и классов. У меня теперь возникает проблема, когда я хочу разобрать JSON следующим образом:

 "fields": { "Suburb": "Paddington", "State": "NSW", "Post Code": "2074", "Lollipop": "Foo Bar Haz" } 

Где я не могу знать ключи карты перед рукой (они могут быть определены пользователем). Таким образом, я не уверен, как должен выглядеть связанный Java-класс.

То есть, для этого примера это может выглядеть так:

 public class MyClass { public String Suburb; public String State; public String PostCode; public String Lollipop; } 

Но это может быть неверно для другого экземпляра JSON-файла. В идеале мне нужен какой-то способ для Джексона сопоставить значения с чем-то вроде NameValuePair . Я подозреваю, что автоматическое сопоставление объектов может не быть вариантом в этом случае – может кто-то подтвердить или опровергнуть это?

Solutions Collecting From Web of "Jackson ObjectMapper с произвольными ключами JSON"

У вас есть два варианта. Либо вы можете использовать readTree в ObjectMapper , который возвращает JsonNode . Работа с JsonNode очень похожа на работу с деревом, поэтому вы можете получить дочерние узлы, прочитать значения и т. Д.

 InputStream ifp = mgr.open("detail_schema.json"); JsonNode root = mapper.readTree(ifp); JsonNode fields = root.get("fields"); for (JsonNode children : fields.getElements()) { // ... } 

Затем вам нужно будет вручную создать объект DetailSchema.

Или вы можете позволить Джексону десериализовать его как карту, и в этом случае вы будете использовать свой код, но где MyClass будет выглядеть так:

 public class MyClass { public Map<String, Object> fields; // getter/setters } 

Возможно, вы также можете ввести значения карты как String если вы уверены, что входы представляют собой текст в json. (На самом деле, я не уверен, какой тип принудительного исполнения Джексон, может быть, он все равно позволит …)