- Saved searches
- Use saved searches to filter your results more quickly
- License
- snakeyaml/snakeyaml
- Name already in use
- Sign In Required
- Launching GitHub Desktop
- Launching GitHub Desktop
- Launching Xcode
- Launching Visual Studio Code
- Latest commit
- Git stats
- Files
- README.md
- Разбор YAML с помощью SnakeYAML
- 1. Обзор
- 2. Настройка проекта
- 3. Точка входа
- 4. Загрузка документа YAML
- 4.1. Базовое использование
- 4.2. Пользовательский тип
- 4.3. Неявные типы
- 5. Захоронение документов YAML
- 5.1. Базовое использование
- 5.2. Пользовательские объекты Java
- 6. Заключение
- Читайте ещё по теме:
Saved searches
Use saved searches to filter your results more quickly
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.
License
snakeyaml/snakeyaml
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Sign In Required
Please sign in to use Codespaces.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching Xcode
If nothing happens, download Xcode and try again.
Launching Visual Studio Code
Your codespace will open once ready.
There was a problem preparing your codespace, please try again.
Latest commit
Git stats
Files
Failed to load latest commit information.
README.md
The art of simplicity is a puzzle of complexity.
When you are here because of some vulnerability report please be aware that it is most probably a false positive.
When you use SnakeYAML to configure your application you are totally safe.
When a low quality tooling is complaining
- Go to the issue tracker of your low quality tooling and file a bug report about a false positive. You will be impressed with the amount of bugs already created and ignored (this makes the tool low quality — the bugs are created but ignored). The big amount of already reported issues should not stop you — they must be aware of the stream of false positives they produce.
- Go to your manager or security specialist and present this information. If you pay for the low quality tooling they cannot leave it unattended.
- Develop further and be happy !
YAML is a data serialization format designed for human readability and interaction with scripting languages.
SnakeYAML is a YAML 1.1 processor for the Java Virtual Machine version 8+. For YAML 1.2 (which is a superset of JSON) you may have a look at SnakeYAML Engine
- a completeYAML 1.1 processor. (If you need YAML 1.2 support have a look here). In particular, SnakeYAML can parse all examples from the specification.
- Unicode support including UTF-8/UTF-16 input/output.
- high-level API for serializing and deserializing native Java objects.
- support for all types from the YAML types repository.
- relatively sensible error messages.
- when you plan to feed the parser with untrusted data please study the settings which allow to restrict incoming data.
- GIT is now used to dance with the source code.
- If you find a bug in SnakeYAML, please file a bug report.
- You may discuss SnakeYAML at the mailing list.
- Slack workspace
- Telegram group is removed because of the spam
- YAML community
Разбор YAML с помощью SnakeYAML
Обзор разбора простых и не очень простых документов YAML в Java-объекты – и наоборот – с помощью библиотеки SnakeYAML.
1. Обзор
В этом учебнике мы узнаем, как использовать ЗмеяЯМЛ библиотека к сериализации java-объектов к документам YAML и наоборот .
2. Настройка проекта
Для того, чтобы использовать SnakeYAML в нашем проекте, мы добавим следующую зависимость Maven (последняя версия может быть найдена здесь ):
3. Точка входа
Ямл класс является точкой входа для API:
Поскольку реализация не является безопасной для потоков, различные потоки должны иметь свои собственные Ямл пример.
4. Загрузка документа YAML
Библиотека обеспечивает поддержку загрузки документа из Струнные или ВходНая трансляция . Большинство образцов кода здесь будет основано на анализе ВходНая трансляция .
Начнем с определения простого документа YAML и назвав файл как customer.yaml :
firstName: "John" lastName: "Doe" age: 20
4.1. Базовое использование
Теперь мы будем разбирать выше YAML документ с Ямл класс:
Yaml yaml = new Yaml(); InputStream inputStream = this.getClass() .getClassLoader() .getResourceAsStream("customer.yaml"); Mapobj = yaml.load(inputStream); System.out.println(obj);
Вышеупомянутый код генерирует следующий выход:
По умолчанию нагрузки () метод возвращает Карта пример. Запрос Карта объект каждый раз потребует от нас знать ключевые имена свойств заранее, и это также не легко пройти через вложенные свойства.
4.2. Пользовательский тип
Библиотека также предоставляет способ загрузки документа в качестве пользовательского класса . Эта опция позволит легко пройти данные в памяти.
Давайте определим Клиентская класса и попытаться загрузить документ снова:
Предполагая, что документ YAML будет deserialized как известный тип, мы можем указать явное глобальное тег в документе.
Давайте обновим документ и храним его в новом файле customer_with_type.yaml:
!!com.baeldung.snakeyaml.Customer firstName: "John" lastName: "Doe" age: 20
Обратите внимание на первую строку в документе, в которой содержится информация о классе, который будет использоваться при его загрузке.
Теперь мы обновим код, используемый выше, и перейдем новое имя файла в качестве ввода:
Yaml yaml = new Yaml(); InputStream inputStream = this.getClass() .getClassLoader() .getResourceAsStream("yaml/customer_with_type.yaml"); Customer customer = yaml.load(inputStream);
нагрузки () метод теперь возвращает экземпляр Клиентская тип . Недостатком этого подхода является то, что тип должен экспортироваться в качестве библиотеки для использования в тех случаях, когда это необходимо .
Хотя, мы могли бы использовать явный локальный тег, для которого мы не обязаны экспортировать библиотеки.
Другим способом загрузки пользовательского типа является использование Конструктор класс . Таким образом, мы можем указать тип корня для документа YAML для разбора. Давайте создадим Конструктор например, с Клиентская введать в качестве корневого типа и передать его Ямл пример.
Теперь о загрузке customer.yaml, Мы получим Клиентская объект:
Yaml yaml = new Yaml(new Constructor(Customer.class));
4.3. Неявные типы
В случае, если нет типа, определенного для данного свойства, библиотека автоматически преобразует значение в неявный тип .
1.0 -> Float 42 -> Integer 2009-03-30 -> Date
Давайте проверьте это неявное преобразование типа с помощью тестового случая:
@Test public void whenLoadYAML_thenLoadCorrectImplicitTypes() < Yaml yaml = new Yaml(); Mapгде каждый объект имеет тип Карта. Если пользовательский тип желательно, то мы можем использовать Конструктор например, как обсуждалось выше .Рассмотрим следующие документы в одном файле:
">--- firstName: "John" lastName: "Doe" age: 20 --- firstName: "Jack" lastName: "Jones" age: 25Мы можем разобрать выше, используя loadAll () метод, показанный в приведенной ниже примере кода:
@Test public void whenLoadMultipleYAMLDocuments_thenLoadCorrectJavaObjects() < Yaml yaml = new Yaml(new Constructor(Customer.class)); InputStream inputStream = this.getClass() .getClassLoader() .getResourceAsStream("yaml/customers.yaml"); int count = 0; for (Object object : yaml.loadAll(inputStream)) < count++; assertTrue(object instanceof Customer); >assertEquals(2,count); >5. Захоронение документов YAML
Библиотека также предоставляет метод сбросить данный объект Java в документ YAML . Выход может быть Струнные или указанный файл/поток.
5.1. Базовое использование
Начнем с простого примера сброса экземпляра Карта к документу YAML ( Струнные ):
@Test public void whenDumpMap_thenGenerateCorrectYAML() < Mapdata = new LinkedHashMap (); data.put("name", "Silenthand Olleander"); data.put("race", "Human"); data.put("traits", new String[] < "ONE_HAND", "ONE_EYE" >); Yaml yaml = new Yaml(); StringWriter writer = new StringWriter(); yaml.dump(data, writer); String expectedYaml = "name: Silenthand Olleander\nrace: Human\ntraits: [ONE_HAND, ONE_EYE]\n"; assertEquals(expectedYaml, writer.toString()); > Вышеупомянутый код производит следующий вывод (обратите внимание, что с помощью экземпляра LinkedHashMap сохраняет порядок выходных данных):
name: Silenthand Olleander race: Human traits: [ONE_HAND, ONE_EYE]5.2. Пользовательские объекты Java
Мы также можем выбрать сброс пользовательских типов Java в выходный поток . Это, однако, добавит глобальный явный тег к выходной документу:
@Test public void whenDumpACustomType_thenGenerateCorrectYAML() < Customer customer = new Customer(); customer.setAge(45); customer.setFirstName("Greg"); customer.setLastName("McDowell"); Yaml yaml = new Yaml(); StringWriter writer = new StringWriter(); yaml.dump(customer, writer); String expectedYaml = "!!com.baeldung.snakeyaml.Customer \n"; assertEquals(expectedYaml, writer.toString()); >С помощью вышеуказанного подхода мы по-прежнему сбрасываем информацию о теге в документе YAML.
Это означает, что мы должны экспортировать наш класс в качестве библиотеки для любого потребителя, который deserializing его. Чтобы избежать имени тега в файле вывода, мы можем использовать dumpAs () метод, предоставляемый библиотекой.
Таким образом, в приведеном выше коде, мы могли бы настроить следующее, чтобы удалить тег:
yaml.dumpAs(customer, Tag.MAP, null);6. Заключение
Эта статья иллюстрирует использование библиотеки SnakeYAML для сериализации объектов Java для YAML и наоборот.
Все примеры можно найти в проект GitHub – это проект на основе Maven, поэтому он должен быть легким для импорта и запуска, как она есть.
Читайте ещё по теме: