如何用Java解析TOML文档

zd287kbt  于 2023-04-04  发布在  Java
关注(0)|答案(2)|浏览(544)

在我的Java应用程序中,我从REST服务响应中获得一个TOML文档,作为String,然后研究如何解析它并将其转换为Java对象。
理想情况下,我想使用一些现有的Map器库进行反序列化,比如JSON对象的Jackson或Gson。Java生态系统中有没有这样的选项?

7jmck4yq

7jmck4yq1#

在Java中有几个库可以处理TOML文件,例如mwanji/toml4jtomlj/tomljtoml4j看起来维护得更好,并且能够将TOML文件Map到POJO类,因此它应该完全符合您的需求。
从其文件中:
Toml#to(Class<T>)将一个Toml示例Map到给定的类。
TOML文件示例:

name = "Mwanji Ezana"

[address]
  street = "123 A Street"
  city = "AnyVille"
  
[contacts]
  "email address" = "me@example.com"

POJO类示例:

class Address {
  String street;
  String city;
}

class User {
  String name;
  Address address;
  Map<String, Object> contacts;
}

如何将TOML文件Map到POJO类:

User user = new Toml().read(tomlFile).to(User.class);

assert user.name.equals("Mwanji Ezana");
assert user.address.street.equals("123 A Street");
assert user.contacts.get("\"email address\"").equals("me@example.com");
rsaldnfx

rsaldnfx2#

我曾经也为TOML创建了一个 Package 器。不记得这样做的确切原因,但它很有趣。没有在任何地方推广它,多年来没有人使用它,所以我发现了这个stackoverflow帖子并添加了这个变体。填写免费贡献!
https://github.com/toml-java/tomlj-mapper

用法

pom.xml:

<dependency>
    <groupId>com.github.toml-java</groupId>
    <artifactId>tomlj-mapper</artifactId>
    <version>0.3.0</version>
</dependency>

simple.toml:

key1 = 'value1'
array1 = [1, 2, 3, 4]

Test.java:

import com.github.tomlj.mapper.TomlObjectMapper;

class Test {
    @Test
    public parseSimple() {
        try (InputStream inputStream = getClass().getResourceAsStream("/simple.toml")) {
            TomlObjectMapper<Simple> mapper = TomlObjectMapper.forClass(Simple.class);

            // When
            Simple simple = mapper.parse(inputStream);

            // Then
            assertEquals(new Simple("value1", Arrays.asList(1L, 2L, 3L, 4L)), simple);
        }
    }
}

Simple.java:

public class Simple {
    private final String key1;
    private final List<Long> array1;

    public Simple(String key1, List<Long> array1) {
        this.key1 = key1;
        this.array1 = array1;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Simple simple = (Simple) o;
        return Objects.equals(key1, simple.key1) && Objects.equals(array1, simple.array1);
    }

    @Override
    public int hashCode() {
        return Objects.hash(key1, array1);
    }

    @Override
    public String toString() {
        return "Simple{" + "key1='" + key1 + '\'' + ", array1=" + array1 + '}';
    }
}

相关问题