Как создать json файл java
Перейти к содержимому

Как создать json файл java

  • автор:

How to Write/create a JSON file using Java?

JSON or JavaScript Object Notation is a lightweight text-based open standard designed for human-readable data interchange. Conventions used by JSON are known to programmers, which include C, C++, Java, Python, Perl, etc. Sample JSON document

Json-simple library

The json-simple is a light weight library which is used to process JSON objects. Using this you can read or, write the contents of a JSON document using Java program.

JSON-Simple maven dependency

Following is the maven dependency for the JSON-simple library −

Paste this with in the <dependencies> </dependencies> tag at the end of your pom.xml file. (before </project> tag)

Example

To create a JSON document using a Java program −

  • Instantiate the JSONObject class of the json-simple library.
  • Insert the required key-value pairs using the put() method of the JSONObject class.
  • Write the created JSON object into a file using the FileWriter class as −

Following Java program creates a JSON object and writes it into a file named output.json.

Example

Output

If you observe the contents of the JSON file you can see the created data as −

# JSON in Java

JSON (JavaScript Object Notation) is a lightweight, text-based, language-independent data exchange format that is easy for humans and machines to read and write. JSON can represent two structured types: objects and arrays. JSON is often used in Ajax applications, configurations, databases, and RESTful web services. The Java API for JSON Processing

(opens new window) provides portable APIs to parse, generate, transform, and query JSON.

# Using Jackson Object Mapper

Example: String to Object

Example: Object to String

# Details

Import statement needed:

# ObjectMapper instance

  • ObjectMapper is threadsafe
  • recommended: have a shared, static instance

# Deserialization:

  • valueType needs to be specified — the return will be of this type
  • Throws
  • IOException — in case of a low-level I/O problem
  • JsonParseException — if underlying input contains invalid content
  • JsonMappingException — if the input JSON structure does not match object structure

Usage example (jsonString is the input string):

# Method for serialization:

String writeValueAsString(Object value)

    — `JsonProcessingException` in case of an error — Note: prior to version 2.1, throws clause included IOException; 2.1 removed it.

# JSON To Object (Gson Library)

Lets assume you have a class called Person with just name

Code:

# JSONObject.NULL

If you need to add a property with a null value, you should use the predefined static final JSONObject.NULL and not the standard Java null reference.

JSONObject.NULL is a sentinel value used to explicitly define a property with an empty value.

Note

Which is a clear violation of Java.equals()

For any non-null reference value x, x.equals(null) should return false

# JSON Builder — chaining methods

(opens new window) while working with JSONObject and JSONArray .

JSONObject example

JSONArray

# Object To JSON (Gson Library)

Lets assume you have a class called Person with just name

Code:

(opens new window) jar must be on the classpath.

# JSON Iteration

Iterate over JSONObject properties

Iterate over JSONArray values

# optXXX vs getXXX methods

JSONObject and JSONArray have a few methods that are very useful while dealing with a possibility that a value your are trying to get does not exist or is of another type.

The same rules apply to the getXXX / optXXX methods of JSONArray .

# Encoding data as JSON

If you need to create a JSONObject and put data in it, consider the following example:

# Decoding JSON data

If you need to get data from a JSONObject , consider the following example:

# Extract single element from JSON

# JsonArray to Java List (Gson Library)

Here is a simple JsonArray which you would like to convert to a Java ArrayList :

Now pass the JsonArray ‘list’ to the following method which returns a corresponding Java ArrayList :

You should add the following maven dependency to your POM.xml file:

Or you should have the jar com.google.code.gson:gson:jar:<version> in your classpath.

# Deserialize JSON collection to collection of Objects using Jackson

Suppose you have a pojo class Person

And you want to parse it into a JSON array or a map of Person objects. Due to type erasure you cannot construct classes of List<Person> and Map<String, Person> at runtime directly (and thus use them to deserialize JSON). To overcome this limitation jackson provides two approaches — TypeFactory and TypeReference .

TypeFactory

The approach taken here is to use a factory (and its static utility function) to build your type for you. The parameters it takes are the collection you want to use (list, set, etc.) and the class you want to store in that collection.

TypeReference

The type reference approach seems simpler because it saves you a bit of typing and looks cleaner. TypeReference accepts a type parameter, where you pass the desired type List<Person> . You simply instantiate this TypeReference object and use it as your type container.

Now let’s look at how to actually deserialize your JSON into a Java object. If your JSON is formatted as an array, you can deserialize it as a List. If there is a more complex nested structure, you will want to deserialize to a Map. We will look at examples of both.

Rukovodstvo

статьи и идеи для разработчиков программного обеспечения и веб-разработчиков.

Чтение и запись JSON на Java

Что такое JSON? Нотация объектов JavaScript, или сокращенно JSON [https://www.json.org/], представляет собой формат обмена данными, который был представлен в 1999 году и получил широкое распространение в середине 2000-х годов. В настоящее время это фактически стандартный формат связи между веб-службами и их клиентами (браузерами, мобильными приложениями и т. Д.). Умение читать и писать — важный навык для любого разработчика программного обеспечения. Несмотря на то, что JSON был получен из JavaScript, это независимый от платформы формат. Ты

Время чтения: 9 мин.

Что такое JSON?

Нотация объектов JavaScript, или сокращенно JSON, — это формат обмена данными, который был представлен в 1999 году и получил широкое распространение в середине 2000-х годов. В настоящее время это фактически стандартный формат связи между веб-службами и их клиентами (браузерами, мобильными приложениями и т. Д.). Умение читать и писать — важный навык для любого разработчика программного обеспечения.

Несмотря на то, что JSON был получен из JavaScript, это независимый от платформы формат. Вы можете работать с ним на нескольких языках программирования, включая Java, Python, Ruby и многие другие. На самом деле любой язык, который может анализировать строку, может обрабатывать JSON.

Популярность JSON привела к его встроенной поддержке многими базами данных, последние версии PostgreSQL и MySQL содержат встроенную поддержку запросов к данным, хранящимся в полях JSON. Базы данных NoSQL, такие как MongoDB, были построены на этом формате и используют документы JSON для хранения записей, так же как таблицы и строки хранят записи в реляционной базе данных.

Одно из основных преимуществ JSON по сравнению с форматом данных XML — это размер документа. Поскольку JSON не имеет схемы, нет необходимости нести огромные структурные издержки, такие как пространства имен и оболочки.

JSON — это общий формат данных, который имеет шесть типов данных:

  • Струны
  • Числа
  • Булевы
  • Массивы
  • Объекты
  • ноль

Давайте посмотрим на простой документ JSON:

Эта структура определяет объект, который представляет человека по имени «Бенджамин Уотсон». Здесь мы можем увидеть его данные, такие как его возраст, семейное положение и увлечения.

По сути, объект JSON — это не что иное, как строка. Строка, представляющая объект, поэтому объекты JSON часто называют строками JSON или документами JSON .

json-простой

Поскольку в Java нет встроенной поддержки JSON, прежде всего, мы должны добавить новую зависимость, которая предоставит нам ее. Для начала воспользуемся модулем json-simple , добавив его как зависимость Maven.

Этот модуль полностью соответствует спецификации JSON RFC4627 и обеспечивает основные функции, такие как кодирование и декодирование объектов JSON, и не имеет никаких зависимостей от внешних модулей.

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

Здесь мы создаем экземпляр JSONObject , добавляя имя и возраст в качестве свойств. Затем мы создаем экземпляр класса JSONArray складывая два строковых элемента и помещая его в качестве третьего свойства нашего sampleObject . В конечном итоге мы преобразуем sampleObject в документ JSON, вызывая метод toJSONString() и записывая его в файл.

Чтобы запустить этот код, мы должны создать точку входа в наше приложение, которая могла бы выглядеть так:

В результате выполнения этого кода мы получим файл с именем example.json в корне нашего пакета. Содержимое файла будет документом JSON со всеми введенными нами свойствами:

Большой! У нас только что был первый опыт работы с форматом JSON, мы успешно сериализовали в него объект Java и записали его в файл.

Теперь, с небольшой модификацией нашего исходного кода, мы можем прочитать объект JSON из файла и распечатать его на консоли либо полностью, либо распечатать выбранные отдельные свойства:

Важно отметить, что метод parse() возвращает Object и мы должны явно привести его к JSONObject .

Если у вас есть искаженный или поврежденный документ JSON, вы получите исключение, подобное этому:

Чтобы смоделировать это, попробуйте удалить последнюю закрывающую скобку > .

Копать глубже

Несмотря на то, что json-simple полезен, он не позволяет нам использовать пользовательские классы без написания дополнительного кода. Предположим, у нас есть класс, представляющий человека из нашего первоначального примера:

Давайте возьмем документ JSON, который мы использовали в качестве примера в начале, и поместим его в файл example.json

Наша задача — десериализовать этот объект из файла в экземпляр класса Person Давайте сначала попробуем сделать это с помощью simple-json

Изменив наш main() , повторно используя статический readSimpleJsonDemo() и добавив необходимый импорт, мы получим:

Выглядит не очень хорошо, у нас много странных типов, но, похоже, он работает, не так ли?

Попробуем вывести на консоль массив kids Person а затем возраст первого ребенка.

Как мы видим, первый вывод консоли показывает, казалось бы, хороший результат:

но второй выдает Exception :

Проблема здесь в том, что наше приведение типа к List<Person> не создавало два новых Person , а просто заполняло то, что там было — JSONObject в нашем текущем случае. Когда мы попытались копнуть глубже и узнать фактический возраст первого ребенка, мы столкнулись с ClassCastException .

Это большая проблема, которую, я уверен, вы сможете преодолеть, написав кучу очень умного кода, которым вы могли бы гордиться, но есть простой способ сделать это с самого начала.

Джексон

Библиотека, которая позволит нам делать все это очень эффективно, называется Jackson . Это очень распространено и используется в крупных корпоративных проектах, таких как Hibernate .

Давайте добавим это как новую зависимость Maven:

Базовый класс, который мы будем использовать, называется ObjectMapper , у него есть метод readValue() который принимает два аргумента: источник для чтения и класс, в который будет приведен результат.

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

FAIL_ON_SELF_REFERENCESÂ Функция, которая определяет, что происходит, когда прямая ссылка на себя обнаруживается POJO (и для него не включена обработка идентификатора объекта): либо генерируется исключение JsonMappingException (если true), либо ссылка обрабатывается нормально (false). INDENT_OUTPUT Функция, которая позволяет включать (или отключать) отступы для базового генератора, используя симпатичный принтер по умолчанию, настроенный для ObjectMapper (и ObjectWriters, созданных из mapper). ORDER_MAP_ENTRIES_BY_KEYES Функция, которая определяет, сортируются ли записи карты сначала по ключу перед сериализацией или нет: если включен, при необходимости выполняется дополнительный этап сортировки (не требуется для SortedMaps), если отключен, дополнительная сортировка не требуется. USE_EQUALITY_FOR_OBJECT_ID Функция, которая определяет, сравнивается ли идентичность объекта, используя истинную идентичность объекта на уровне JVM (false); или метод equals (). Функция, которая определяет, как сериализуется тип char []: при включении будет сериализован как явный массив JSON (с односимвольными строками в качестве значений); при отключении по умолчанию они сериализуются как строки (что более компактно). WRITE_DATE_KEYS_AS_TIMESTAMPS Функция, которая определяет, будут ли даты (и подтипы), используемые в качестве ключей карты, сериализоваться как отметки времени или нет (в противном случае будут сериализованы как текстовые значения). WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS Функция, которая контролирует, должны ли числовые значения меток времени записываться с использованием наносекундных меток времени (включено) или нет (отключено); тогда и только тогда, когда тип данных поддерживает такое разрешение. WRITE_DATES_AS_TIMESTAMPS Функция, которая определяет, должны ли значения даты (и даты / времени) (и вещи на основе даты, такие как календари) быть сериализованы как числовые отметки времени (true; по умолчанию) или как что-то еще (обычно текстовое представление). WRITE_DATES_WITH_ZONE_ID Функция, которая определяет, следует ли сериализовать значения даты / даты и времени, чтобы они включали идентификатор часового пояса, в случаях, когда сам тип содержит информацию о часовом поясе.

Полный список перечисления SerializationFeature доступен здесь .

К сожалению, после запуска этого фрагмента кода мы получим исключение:

Судя по всему, мы должны добавить конструктор по умолчанию в класс Person

Повторно запустив код, мы увидим еще одно исключение:

Это немного сложнее решить, поскольку сообщение об ошибке не сообщает нам, что делать для достижения желаемого результата. Игнорирование свойства не является жизнеспособным вариантом, поскольку мы явно имеем его в документе JSON и хотим, чтобы оно было переведено в результирующий объект Java.

Проблема здесь связана с внутренней структурой библиотеки Джексона. Он извлекает имена свойств из геттеров, удаляя их первые части. В случае getAge() и getName() он работает отлично, но с isMarried() этого не происходит и предполагается, что поле должно называться married а не isMarried .

Жестокий, но рабочий вариант — мы можем решить эту проблему, просто переименовав геттер в isIsMarried . Давайте попробуем это сделать.

Больше никаких исключений не появляется, и мы видим желаемый результат!

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

Мы можем добиться того же результата, добавив аннотацию к isMarried() :

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

Заключение

JSON — это легкий текстовый формат, который позволяет нам представлять объекты и передавать их через Интернет или хранить в базе данных.

В Java нет встроенной поддержки манипуляций с JSON, однако есть несколько модулей, которые предоставляют эту функцию. В этом руководстве мы рассмотрели json-simple и Jackson , показывая сильные и слабые стороны каждого из них.

Работая с JSON, вы должны помнить о нюансах модулей, с которыми вы работаете, и тщательно отлаживать исключения, которые могут появляться.

Введение в JSON с Java

Программирование играет незаменимую роль в разработке программного обеспечения, но, хотя оно эффективно для систематического решения проблем, оно не дотягивает до нескольких важных категорий. В облачной и распределенной эпохе программного обеспечения данные играют ключевую роль в получении дохода и поддержании эффективного продукта. Независимо от того, обмениваются ли данные конфигурации или данные через веб-интерфейс прикладного программирования (API), наличие компактного, понятного человеку языка данных имеет важное значение для поддержания динамической системы и позволяет специалистам, не занимающимся программированием, понять систему.

Хотя двоичные данные могут быть очень сжатыми, их невозможно прочитать без надлежащего редактора или обширных знаний. Вместо этого большинство систем используют текстовый язык данных, такой как eXtensive Markup Language (XML), Another Another Markup Language (YML) или Нотация объектов Javascript (JSON). Хотя XML и YML имеют свои собственные преимущества, JSON стал лидером в области API-интерфейсов конфигурации и передачи представительного состояния (REST). Он сочетает в себе простоту и достаточно богатство, чтобы легко выразить широкий спектр данных.

Хотя JSON достаточно прост для чтения и записи как программистами, так и непрограммистами, наши программисты должны быть способны производить и использовать JSON, что может быть далеко не просто. К счастью, существует множество библиотек Java JSON, которые эффективно решают эту задачу. В этой статье мы расскажем об основах JSON, в том числе о базовом обзоре и общих случаях использования, а также о том, как сериализовать объекты Java в JSON и как десериализовать объекты JSON в объекты Java с помощью почтенной библиотеки Джексона. Обратите внимание, что весь код, используемый для этого урока, можно найти на Github .

Основы JSON

JSON не начинался как текстовый язык конфигурации. Строго говоря, это фактически код Javascript, который представляет поля объекта и может использоваться компилятором Javascript для воссоздания объекта. На самом элементарном уровне объект JSON представляет собой набор пар ключ-значение, заключенный в фигурные скобки и двоеточие, отделяющее ключ от значения; ключ в этой паре — строка, заключенная в кавычки, а значение — значение JSON. Значение JSON может быть любым из следующих:

  • другой объект JSON
  • строка
  • число
  • логический литерал true
  • логический литерал false
  • буквальный null
  • массив значений JSON

Например, простой объект JSON с только строковыми значениями может быть:

Аналогичным образом, другой объект JSON может выступать в качестве значения, а также числа, либо логического литерала, либо null литерала, как показано в следующем примере:

Массив JSON — это список значений, разделенных запятыми, в квадратных скобках. Этот список не содержит ключей; вместо этого он содержит только любое количество значений, включая ноль. Массив, содержащий нулевые значения, называется пустым массивом . Например:

Массивы JSON могут быть разнородными и содержать значения смешанных типов, таких как:

Тем не менее, это строго соблюдаемое общее соглашение для массивов, содержащих одинаковые типы данных. Аналогично, объекты в массиве обычно имеют те же ключи и типы значений, что и в предыдущем примере. Например, каждое значение в cars массиве имеет ключ make со строковым значением, key модель со строковым значением и ключ year с числовым значением.

Важно отметить, что порядок пар ключ-значение в объекте JSON и порядок элементов в массиве JSON не учитывают равенство двух объектов или массивов JSON соответственно. Например, следующие два объекта JSON эквивалентны:

JSON Files

Файл, содержащий данные JSON, использует .json расширение файла и имеет корень либо объекта JSON, либо массива JSON. Файлы JSON могут содержать не более одного корневого объекта. Если требуется более одного объекта, корнем файла JSON должен быть массив, содержащий нужные объекты. Например, оба из следующих допустимых файлов JSON:

Несмотря на то, что для файла JSON допустимо иметь массив в качестве корня, обычной практикой для корня является объект с одним ключом, содержащим массив. Это делает назначение массива явным:

Преимущества JSON

JSON имеет три основных преимущества: (1) он может быть легко прочитан людьми, (2) он может быть эффективно проанализирован с помощью кода, и (3) он выразителен. Первое преимущество очевидно при чтении файла JSON. Хотя некоторые файлы могут стать большими и сложными — содержащими много разных объектов и массивов, — размер этих файлов громоздок, а не язык, на котором они написаны. Например, приведенные выше фрагменты могут быть легко прочитаны без использования контекста или использования определенного набора инструментов.

Аналогично, код также может относительно легко анализировать JSON; весь язык JSON может быть сведен к набору простых конечных автоматов, как описано в стандарте обмена данными JSON ECMA-404 . В следующих разделах мы увидим, что эта простота преобразуется в библиотеки синтаксического анализа JSON на Java, которые могут быстро и точно использовать строки или файлы JSON и создавать пользовательские объекты Java.

Наконец, простота интерпретации не умаляет ее выразительности. Практически любая объектная структура может быть рекурсивно сведена к объекту или массиву JSON. Те поля, которые трудно сериализовать в объекты JSON, могут быть преобразованы в строку, и их строковое значение будет использовано вместо представления их объекта. Например, если мы хотим сохранить регулярное выражение в качестве значения, мы можем сделать это, просто превратив регулярное выражение в строку.

Понимая основы JSON, мы теперь можем углубиться в детали взаимодействия с фрагментами JSON и файлами через приложения Java.

Сериализация Java-объектов в JSON

Хотя процесс токенизации и анализа строк JSON утомителен и запутан, в Java существует множество библиотек, которые инкапсулируют эту логику в простые в использовании объекты и методы, которые делают взаимодействие с JSON почти тривиальным. Одна из самых популярных среди этих библиотек — FasterXML Jackson .

Джексон сосредотачивается вокруг простой концепции: ObjectMapper . An ObjectMapper — это объект, который инкапсулирует логику для взятия объекта Java и его сериализации в JSON, передачи JSON и десериализации его в указанный объект Java. В первом случае мы можем создавать объекты, представляющие нашу модель, и делегировать логику создания JSON ObjectMapper . Следуя предыдущим примерам, мы можем создать два класса для представления нашей модели: человек и адрес:

Person И Address классы как Plain Old Java Objects (POJOs) и не содержат каких — либо JSON-специфический код. Вместо этого мы можем создать экземпляры этих классов в объектах и ​​передать созданные объекты writeValueAsString методу ObjectMapper . Этот метод создает объект JSON, представленный как String предоставленный объект. Например:

Выполняя этот код, мы получаем следующий вывод:

Если мы красиво напечатаем (отформатируем) этот вывод JSON, используя JSON Validator и Formatter , мы увидим, что он почти соответствует нашему первоначальному примеру:

По умолчанию Джексон будет рекурсивно проходить по полям объекта, предоставленного writeValueAsString методу, используя имя поля в качестве ключа и сериализуя значение в соответствующее значение JSON. В случае String полей значение является строкой; для чисел (например, int ) результат числовой; для boolean s результат — логическое значение; для объектов (таких как Address ) этот процесс сериализации рекурсивно повторяется, в результате чего получается объект JSON.

Два заметных различия между нашим исходным JSON и JSON, выданным Джексоном, заключаются в том, что (1) порядок пар ключ-значение отличается и (2) male вместо ключа есть ключ isMale . В первом случае Джексон не обязательно выводит ключи JSON в том же порядке, в котором соответствующие поля появляются в объекте Java. Например, male ключ является последним ключом в выведенном JSON, даже если isMale поле находится перед address полем в Person объекте. Во втором случае по умолчанию boolean флаги формы isFooBar приводят к парам ключ-значение с ключом формы fooBar .

Если мы хотим, чтобы имя ключа было таким isMale , как оно было в нашем исходном примере JSON, мы можем аннотировать получатель для нужного поля, используя JsonProperty аннотацию, и явно указывать имя ключа:

Повторный запуск приложения приводит к следующей строке JSON, которая соответствует желаемому результату:

В случаях, когда мы хотим удалить null значения из выходных данных JSON (где отсутствующий ключ неявно обозначает null значение, а не явно включает null значение), мы можем аннотировать затронутый класс следующим образом:

Это приводит к следующей строке JSON:

В то время как полученная строка JSON эквивалентна строке JSON, которая явно включала null значение, вторая строка JSON экономит место. Эта эффективность более применима к более крупным объектам, которые имеют много null полей.

Сериализация коллекций

Чтобы создать массив JSON из объектов Java, мы можем передать Collection объект (или любой подкласс) в ObjectMapper . Во многих случаях List будет использоваться a , так как он больше всего напоминает абстракцию массива JSON. Например, мы можем сериализовать List из Person объектов следующим образом :

Выполнение этого кода приводит к следующему выводу:

Запись сериализованных объектов в файл

Помимо сохранения полученного JSON в String переменную, мы можем записать строку JSON непосредственно в выходной файл, используя writeValue метод, предоставляя File объект, который соответствует желаемому выходному файлу (например, john.json ):

Сериализованный Java-объект также может быть записан в любой OutputStream , что позволяет выводить JSON-поток в нужное место (например, по сети или в удаленной файловой системе).

Десериализация JSON в объекты Java

С пониманием того, как взять существующие объекты и сериализовать их в JSON, также важно понять, как десериализовать существующий JSON в объекты. Этот процесс обычен при десериализации файлов конфигурации и напоминает его аналог сериализации, но он также отличается некоторыми важными способами. Во-первых, JSON по своей сути не сохраняет информацию о типе. Таким образом, глядя на фрагмент JSON, невозможно узнать тип представляемого объекта (без явного добавления дополнительного ключа, как в случае с _class ключом в MongoDB). база данных). Чтобы правильно десериализовать фрагмент JSON, мы должны явно сообщить десериализатору ожидаемый тип. Во-вторых, ключи, присутствующие во фрагменте JSON, могут отсутствовать в десериализованном объекте. Например, если более новая версия объекта — содержащая новое поле — была сериализована в JSON, но JSON десериализуется в более старую версию объекта.

Чтобы решить первую проблему, мы должны явно сообщить ObjectMapper требуемый тип десериализованного объекта. Например, мы можем предоставить строку JSON, представляющую Person объект, и дать команду ObjectMapper десериализации его в Person объект:

Выполнение этого фрагмента приводит к следующему выводу:

Важно отметить, что существует два требования, которые должен иметь десериализованный тип (или любые рекурсивно десериализованные типы):

  1. Класс должен иметь конструктор по умолчанию
  2. У класса должны быть сеттеры для каждого из полей

Кроме того, isMale получатель должен быть украшен JsonProperty аннотацией (добавленной в предыдущем разделе), обозначающей, что имя ключа для этого поля равно isMale . Удаление этой аннотации приведет к исключению во время десериализации, поскольку ObjectMapper по умолчанию настроен сбой, если в десериализованном JSON найден ключ, который не соответствует полю в предоставленном типе. В частности, так как ObjectMapper ожидает male поле (если не сконфигурировано с JsonProperty аннотацией), десериализация завершается неудачно, так как male в Person классе не найдено поле .

Чтобы исправить это, мы можем аннотировать Person класс JsonIgnoreProperties аннотацией. Например:

Затем мы можем добавить новое поле, например, favoriteColor во фрагмент JSON, и десериализовать фрагмент JSON в Person объект. Важно отметить, однако, что значение favoriteColor ключа будет потеряно в десериализованном Person объекте, поскольку нет поля для хранения значения:

Выполнение этого фрагмента приводит к следующему выводу:

Десериализация коллекций

В некоторых случаях JSON, который мы хотим десериализовать, имеет массив в качестве корневого значения. Чтобы правильно десериализовать JSON этой формы, мы должны дать команду ObjectMapper десериализации предоставленного фрагмента JSON в Collection (или подкласс), а затем привести результат к Collection объекту с соответствующим универсальным аргументом. Во многих случаях используется List объект, как в следующем коде:

Выполнение этого фрагмента приводит к следующему выводу:

Важно отметить , что бросок Использованный выше непроверенные литой , так как ObjectMapper не может проверить , что общий аргумент List является правильным априорно ; то есть, что ObjectMapper фактически возвращая List из Person объектов , а не List некоторых других объектов (или не List совсем).

Чтение JSON из входного файла

Хотя полезно десериализовать JSON из строки, обычно желаемый JSON будет исходить из файла, а не из предоставленной строки. В этом случае ObjectMapper может быть предоставлен любой объект InputStream или File объект для чтения. Например, мы можем создать файл с именем john.json в classpath, который содержит следующее:

Затем для чтения из этого файла можно использовать следующий фрагмент:

Выполнение этого фрагмента приводит к следующему выводу:

Заключение

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *