不支持的可扩展类型:java.lang.Boolean
请看下面的示例程序:
uses java.nio.file.*
uses dynamic.Dynamic
uses javax.script.Bindings
uses gw.util.GosuEscapeUtil
uses gw.lang.reflect.json.Json
uses gw.lang.reflect.EmptyBindings
var jsonText : String
var jsonParsed : Bindings
var SETTING_NAME : String = "editor.guides.indentation"
var PATH_TO_SETTINGS : String = "C:\\Users\\Kamil Kurkiewicz\\AppData\\Roaming\\Code\\User\\settings.json"
// Bonus Question: Why cannot the two strings be defined as final?
jsonText = Files.readString(Path.of(PATH_TO_SETTINGS))
jsonParsed = Json.fromJson(jsonText)
// If the indent guides are expressly declared not to
// be rendered (which is not the default behavior), remove the setting entirely.
if (jsonParsed.get(SETTING_NAME) == false) {
jsonParsed.remove(SETTING_NAME)
}
// If the setting is not there (which implies the default
// value of true), or the value is needlessly set to true, set it to false.
else {
jsonParsed.put(SETTING_NAME, false)
}
//Files.writeString(Path.of(PATH_TO_SETTINGS), jsonParsed.toJson())
print(jsonParsed.toJson())
带有print语句的这一行会导致以下运行时错误:
java.lang.IllegalStateException: Unsupported expando type: class java.lang.Boolean
at gw.lang.enhancements.CoreBindingsEnhancement.appendGosuValue(CoreBindingsEnhancement.gsx:264)
at gw.lang.enhancements.CoreBindingsEnhancement.toJson(CoreBindingsEnhancement.gsx:54)
at gw.lang.enhancements.CoreBindingsEnhancement.toJson(CoreBindingsEnhancement.gsx:29)
at _nopackage_.GosuScratchpad.evaluate(Unknown Source)
at gw.internal.gosu.parser.GosuProgram.runProgram(GosuProgram.java:455)
at gw.internal.gosu.parser.GosuProgram.evaluate(GosuProgram.java:270)
at gw.internal.gosu.parser.GosuProgram_Proxy.evaluate(gw.internal.gosu.parser.GosuProgram_Proxy:2)
at gw.internal.gosu.parser.ExecutionEnvironment$1.evaluate(ExecutionEnvironment.java:685)
at gw.internal.gosu.parser.ExecutionEnvironment$1.runScript(ExecutionEnvironment.java:658)
at gw.internal.gosu.parser.ExecutionEnvironment$1.run(ExecutionEnvironment.java:624)
at java.base/java.lang.Thread.run(Thread.java:829)
对 toJson() 方法的调用失败,因为在将解析树的后续节点转换回字符串时,appendGosuValue() 子例程甚至都不把 Boolean 视为受支持的expando类型。然而,Boolean 是八种标准包装类型中唯一以这种方式对待的。我的问题是:这是有意为之,还是存在一个错误?
解决方案
动态Expando对象是Gosu中极少使用的特性之一,因此我也不打算花太多时间去弄清楚这个问题。只使用True与 False的字符串表示即可。
我记得大约五年多前就遇到过这个问题,当时我也无法让布尔包装类与toJson函数一起工作。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。