我的项目使用的是hocon配置。我想逐渐将其迁移到 PKL。为了促进过渡期,我希望能够引用旧配置中的一些配置值。
我尝试通过提供自定义资源阅读器来实现它:
import com.typesafe.config.*;
import org.pkl.core.SecurityManagerException;
import org.pkl.core.resource.ResourceReader;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Optional;
class HoconResourceReader implements ResourceReader {
private Config config = ConfigFactory.load();
public Optional<Object> read(URI uri) {
if (config.hasPath(uri.getSchemeSpecificPart())) {
var value = config.getAnyRef(uri.getSchemeSpecificPart());
return Optional.of(value.toString());
} else {
return Optional.empty();
}
}
public String getUriScheme() { return "hocon"; }
public boolean hasHierarchicalUris() { return true; }
public boolean isGlobbable() { return true; }
}
它对于标量值(即字符串)效果很好。但我需要它能够提供复合结构(即具有属性的动态对象)。
有没有办法从自定义值创建对象?
我在这里能想到的一种方法是保留资源读取器方法,但让它将 HOCON 转换为 JSON,然后在 Pkl 中使用 JSON。这是因为 Pkl 已经在该语言中内置了一个 JSON 解析器。
样品包:
import "pkl:json"
jsonifiedHocon = read("hocon:some.value")
result = new json.Parser {}.parse(jsonifiedHocon)