我正在使用 SnakeYAML 2.0 来解析 Java 中的 YAML 文件。但我在这里面临一个问题。这是我的User课:
package ir.sharif;
import java.util.ArrayList;
import java.util.List;
public class User {
int id;
String username;
String password;
List<User> friends = new ArrayList<>();
public User(int id, String username, String password) {
this.id = id;
this.username = username;
this.password = password;
}
public User() {
}
// getters and setters
}
Run Code Online (Sandbox Code Playgroud)
我使用以下代码来序列化User对象:
package ir.sharif;
import org.yaml.snakeyaml.Yaml;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) throws IOException {
User user = new User();
user.setId(10);
user.setUsername("Jack");
user.setPassword("jackSparrow2023");
List<User> friends = new ArrayList<>();
friends.add(new User(1, "Trent", "FCB"));
friends.add(new User(2, "Jordan", "LFC"));
user.setFriends(friends);
Yaml yaml = new Yaml();
yaml.dump(user, new FileWriter("src/main/resources/sample.yml"));
}
}
Run Code Online (Sandbox Code Playgroud)
这是运行方法sample.yml后我的文件的样子:main
!!ir.sharif.User
friends:
- friends: []
id: 1
password: FCB
username: Trent
- friends: []
id: 2
password: LFC
username: Jordan
id: 10
password: jackSparrow2023
username: Jack
Run Code Online (Sandbox Code Playgroud)
现在我想反序列化此数据并将其加载为新User对象:
package ir.sharif;
import org.yaml.snakeyaml.Yaml;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
public class Main {
public static void main(String[] args) throws IOException {
Yaml yaml = new Yaml();
try (Reader reader = new FileReader("src/main/resources/sample.yml")) {
User user = yaml.load(reader);
System.out.println(user);
}
}
}
Run Code Online (Sandbox Code Playgroud)
但运行后,我得到这个异常:
Exception in thread "main" Global tag is not allowed: tag:yaml.org,2002:ir.sharif.User
in 'reader', line 1, column 1:
!!ir.sharif.User
^
Run Code Online (Sandbox Code Playgroud)
我该如何解决?
正如我搜索的那样,我做得没错,但我认为问题是由于 2.0 版本中发生了一些变化而引起的。我尝试像这样加载我的对象(我!!ir.sharif.User从 YAML 文件中删除了行):
Exception in thread "main" Global tag is not allowed: tag:yaml.org,2002:ir.sharif.User
in 'reader', line 1, column 1:
!!ir.sharif.User
^
Run Code Online (Sandbox Code Playgroud)
而且效果很好。但是如果我想反序列化SnakeYAML本身序列化的对象,我就不能使用这个方法了。我应该怎么办?我很感激任何帮助。
您需要注册一个TagInspector允许您的标签的:
var loaderoptions = new LoaderOptions();
TagInspector taginspector =
tag -> tag.getClassName().equals(User.class.getName());
loaderoptions.setTagInspector(taginspector);
Yaml yaml = new Yaml(new Constructor(User.class, loaderoptions));
Run Code Online (Sandbox Code Playgroud)