Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Parse a YAML file

Tags:

java

yaml

This is the first time I am working with YAML files, so the first think I looked at was to find any library that could help me to parse the file.

I have found two libraries, YamlBean and SnakeYAML. I am not sure which one that I am going to use.

Here is an example of the file that I am trying to parse:

users:   user1:     groups:     - Premium   user2:     groups:     - Mod   user3:     groups:     - default groups:   Mod:     permissions:       test: true     inheritance:     - Premium   default:     permissions:       test.test: true     inheritance:     - Mod   Admin:     permissions:       test.test.test: true     inheritance:     - Mod 

The file will change dynamical so I don't know how many users or groups the file would contain.

The information I would like to fetch from this is the user name and the group like this:

user1 Premium user2 Mod user3 default 

And from the groups only the group names, like this:

Mod default Admin 

Anyone could get me started here? And what is the best library to use for this? YamlBean or SnakeYAML?

I guess, I need to save the information in something that I easily could iterate over.

like image 408
Kristoffer Isaksson Avatar asked Sep 11 '14 20:09

Kristoffer Isaksson


People also ask

How can I parse a YAML file in Python?

We can read the YAML file using the PyYAML module's yaml. load() function. This function parse and converts a YAML object to a Python dictionary ( dict object). This process is known as Deserializing YAML into a Python.

How do I read a YAML file?

YAML is a digestible data serialization language often used to create configuration files with any programming language. Designed for human interaction, YAML is a strict superset of JSON, another data serialization language. But because it's a strict superset, it can do everything that JSON can and more.

How do I read a YAML file in Robot Framework?

Using YAML files with Robot Framework requires PyYAML module to be installed. If you have pip_ installed, you can install it simply by running pip install pyyaml. YAML variable files must have either :file:`. yaml` or :file:`.


2 Answers

You could also use Jacksons YAML module.

In order to use that, you'll need a few classes. The model classes which will carry the content of your file and the a class that takes care of reading the YAML file.

The root model class could look like this:

public class MyYamlFile {     @JsonProperty     private List<User> users;     @JsonProperty     private List<Group> groups;      // getter methods ommitted } 

The User(*) class:

public class User {     @JsonProperty     private List<String> name;     @JsonProperty     private List<GroupType> groups;      // getter methods ommitted } 

The GroupType could be an Enum containing all possible group types:

public enum GroupType {     Premium, Mod, Default } 

Don't forget that the enum entries are case sensitive. So "premium" won't work. You can build all your model classes that way. Every sub entry should get an own model class.

Now to the part where you can read that YAML file:

public MyYamlFile readYaml(final File file) {     final ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); // jackson databind     return mapper.readValue(file, MyYamlFile.class); } 

As you can see, this part is really neat, because you don't need much. The file instance contains your YAML file. You can create one like this:

File file = new File("path/to/my/yaml/usersAndGroups.yaml"); 

Instead of File the readValue method also supports InputStream, java.io.Reader, String (with the whole content), java.net.URL and byte array. You should find something that suits you.

(*) You should consider changing the structure of your YAML file, because I don't think it is possible to use dynamic keys with Jackson (maybe someone knows more about that):

users:      - name: user1       groups:         - Premium     - name: user2       groups:         - Mod     - name: user3       groups:         - Default groups:     .... 
like image 152
Tom Avatar answered Sep 23 '22 17:09

Tom


I ended up using SnakeYaml and made some split strings to solve my issue.

Loaded the yaml file to Object and then into a Map, then split the result from the Map into String[] and then in a for loop I read out the name from the String[]. I did the same with groups.

I know that there is better solutions out there but this is good enough for this project.

Thanks all for the replies.

like image 29
Kristoffer Isaksson Avatar answered Sep 22 '22 17:09

Kristoffer Isaksson