С точки зрения непрофессионала, Jackson — это библиотека классов Java, используемая для обработки данных формата JSON, и ее производительность очень хорошая. В этой статье будет приведен более подробный пример анализа использования Джексона. Подробности следующие:
1. Введение
Джексон имеет относительно высокую эффективность сериализации и десериализации. Согласно тестам, независимо от формы преобразования, Джексон > Gson > Json-lib, а вычислительная мощность Джексона даже почти в 10 раз выше, чем у Json-lib, и это правильно. Секс тоже. очень высокий. Напротив, Json-lib, похоже, перестал обновляться, и последняя версия также основана на JDK15, в то время как сообщество Джексона более активно.
Ниже мы кратко представим использование Джексона на примерах.
2. Используйте
Джексон предоставляет множество классов и методов, и наиболее часто используемый класс при сериализации и десериализации — это класс ObjectMapper, который похож на JsonObject и ArrayObject в Json-lib. Этот класс предоставляет для преобразования такие методы, как readTree(), readValue(), writeValueAsString(). Конкретный адрес документации для этого класса: http://jackson.codehaus.org/1.7.9/javadoc/org/codehaus/jackson/map/ObjectMapper.html.
Чтобы избежать повторных описаний, все упомянутые ниже objectMapper происходят из ObjectMapper objectMapper = new ObjectMapper(). Использование будет кратко описано ниже с точки зрения сериализации и десериализации.
1. Сериализация
① Сериализация собственных классов Java.
Тестовый пример
Список list=new ArrayList();list.add(1);list.add(2);list.add(3);
Реализуйте сериализацию:
Строка teststringlist=objectMapper.writeValueAsString(список);System.out.println(teststringlist);
Результат вывода на консоль:
[1,2,3]
в заключение:
Джексон может легко реализовать сериализацию общих типов.
②Сериализация пользовательских классов
Тестовый пример:
студент публичного класса {private int age=10;private String name="hhh"; public String[] list={"hao","haouhao","keyi"}; public Date time=new Date(); () { возвращаемый возраст; } общественный недействительный setAge (int age) { this.age = age } public String getName () { возвращаемое имя; } public void setName (String name) { this.name = name; }}
Чтобы сделать пример более общим, этот класс включает тип значения int, ссылочный тип String, String[] и тип даты Date.
Реализация сериализации
студент st=новый студент();String teststringstu=objectMapper.writeValueAsString(st);System.out.println(teststringstu);
Результат вывода на консоль:
{"list":["хао","haouhao","keyi"],"time":1375429228382,"name":"hhh","age":10}
в заключение:
Из выходных данных видно, что преобразованная строка Json соответствует формату. Однако представление времени немного нестандартно. Изменения формата времени будут представлены ниже.
③Определение формата времени
У Джексона есть собственный формат времени по умолчанию, который представлен в виде временных меток, и его эффект показан в приведенных выше результатах (например: 1375429228382). Если вы хотите установить этот формат недействительным, передайте
objectMapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false)
Его можно настроить так, чтобы при генерации времени использовалась так называемая нотация, соответствующая [ISO-8601], выводящая время в следующем формате: «1970-01-01T00:00:00.000+0000».
Конечно, вы также можете настроить формат выходного времени.
Реализация пользовательского формата времени
В примере также используется класс Student, представленный выше.
Student st=new Student();java.text.DateFormat myFormat = new java.text.SimpleDateFormat("гггг-ММ-дд чч:мм:сс");objectMapper.getSerializationConfig().setDateFormat(myFormat);String teststringstu= objectMapper.writeValueAsString(st);System.out.println(teststringstu);
Вывод недостатков на консоли:
{"list":["хао","haouhao","keyi"],"time":"2013-08-02 03:48:20","name":"hhh","age":10}
в заключение:
Видно, что формат вывода времени стал таким, каким мы хотим. Метод определения формата вывода времени в Jackson намного проще, чем определение формата времени в Json-lib.
④ Другой метод сериализации
Реализация сериализации
Используемый пример по-прежнему относится к предыдущему классу учащихся.
студент st = новый студент (); JsonGenerator jsonGenerator = objectMapper.getJsonFactory (). createJsonGenerator (System.out, JsonEncoding.UTF8); jsonGenerator.writeObject (st); System.out.println ();
Вывод на консоли:
{"list":["хао","haouhao","keyi"],"time":1375429228382,"name":"hhh","age":10}
в заключение:
Этот метод также может получить значение вышеуказанного метода. Но обратите внимание на эту функцию в этом методе: createJsonGenerator(), для которой требуются два параметра: один — параметр типа OutputStream, а другой — параметр типа JsonEncoding. Благодаря этим двум параметрам мы можем понять, что этот метод может не только записывать Json непосредственно в сетевой поток, но также записывать Json в поток файлов или поток памяти. Так что он более универсален.
2. Десериализация
①Однократная десериализация
Этот метод в основном использует метод <testJsonClass> readValue(String content, Class<testJsonClass> valueType), предоставляемый ObjectMapper. Этот метод требует ввода строки Json и соответствующего класса класса, который необходимо заполнить, и возвращает заполненный класс.
Разобрать строку Json в собственный класс
Когда строка Json:
String test1="{"objectID":357,"geoPoints":[{"x":504604.59802246094,"y":305569.9150390625}]}"
время.
Сначала определите класс:
общественный класс testJsonClass {общественный int objectID общественный список geoPoints = новый ArrayList ();}
Затем используйте следующий фрагмент кода для десериализации Json в этот класс:
testJsonClass testClass = objectMapper.readValue(test1, testJsonClass.class);
использовать
System.out.println(testClass.objectID);System.out.println(testClass.geoPoints)
Значения, которые вы можете увидеть на консоли:
357[{x=504604.59802246094, y=305569.9150390625}]
Десериализовать строку Json в собственный класс системы.
Строка json = "{"error":0,"data":{"name":"ABC","age":20,"phone":{"home":"abc","mobile":"def"}," друзья":[{"name":"DEF","телефон" :{"home":"hij","mobile":"klm"}},{"name":"GHI","phone":{"home":"nop","mobile":"qrs"} }]},"other":{"никнейм":[]}}".
Определите переменную, используя собственную карту системы: карты Map<String, Map<String, Object>>. Затем используйте карты = objectMapper.readValue(json, Map.class) для десериализации Json в карты переменных.
проходить
System.out.println(maps.get("ошибка"));System.out.println((Объект)(maps.get("данные").get("телефон")))
В консоли вы можете получить следующие результаты:
0{home=abc, mobile=def}
②Постепенная десериализация
Этот метод более гибок и может извлечь только то информационное значение строки Json, которое интересует пользователя. В основном он реализован с использованием readTree, предоставленного ObjectMapper, и класса JsonNode, предоставленного Джексоном.
Тестовый пример
Нить test="{"results":[{"objectID":357,"geoPoints":[{"x":504604.59802246094,"y":305569.915039 0625}]},{"objectID":358,"geoPoints":[{"x":504602.2680053711,"y":305554.43603515625}]}]}";
Эта строка Json относительно сложна, включая форму вложенных массивов, и является универсальной.
Реализация десериализации
JsonNode node= objectMapper.readTree(test); //Читаем строку Json в память в древовидной структуре JsonNodecontents=node.get("results");//Получаем информацию под узлом результатов for(int i=0 ; я<contents.size();i++) // Просматривая информацию под результатами, функция size() может получить количество информации, содержащейся в узле, аналогичное длине массива {System.out.println(contents.get(i).get("objectID" ). getIntValue()); //Читаем значение дочернего узла под узлом JsonNode geoNumber=contents.get(i).get("geoPoints");for(int j=0;j<geoNumber.size();j++) //Проходим по информации под дочерними узлами {System.out.println(geoNumber.get(j).get("x").getDoubleValue()+" " +geoNumber.get(j).get("y").getDoubleValue());}}
Вывод на консоли:
357504604.59802246094 305569.9150390625358504602.2680053711 305554.43603515625
в заключение:
Этот метод аналогичен анализу DOM при анализе XML. Преимущество состоит в том, что структура детализирована, что позволяет легко извлечь нужную информацию. Конечно, недостаток тот же, что и у этого метода: он требует времени и места.
3. Резюме
Операции Джексона с Json в основном такие, как показано выше. Его метод очень удобен в использовании и очень гибок. Он обеспечивает одноразовые операции и операции, которые могут считывать информацию по требованию. И у Джексона есть полный набор функций, которые могут управлять сериализацией и десериализацией в различных деталях, таких как функция аннотации, функция отложенного внедрения для Hibernate и функция установки формата времени. Поскольку эти функции в настоящее время не нужны, оставьте это внимательно. на потом. В то же время Джексон также поддерживает ряд операций сериализации и десериализации XML. Идея примерно такая же, как и при анализе Json.
Что касается текущих недостатков Jackson, некоторые люди в Интернете проверили, что он занимает больше памяти, чем Json-lib. Использование пространства вместо времени, как правило, того стоит.