Gosu中Bindings.toJson()不支持Boolean:是设计意图还是Bug?
Gosu中Bindings.toJson()不支持Boolean类型:设计还是Bug?
示例代码
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" // 附加问题:为何这两个字符串无法定义为final? jsonText = Files.readString(Path.of(PATH_TO_SETTINGS)) jsonParsed = Json.fromJson(jsonText) // 如果明确声明不显示缩进参考线(非默认行为),则完全移除该设置。 if (jsonParsed.get(SETTING_NAME) == false) { jsonParsed.remove(SETTING_NAME) } // 如果该设置不存在(意味着默认值为true),或不必要地设为true,则将其设为false。 else { jsonParsed.put(SETTING_NAME, false) } //Files.writeString(Path.of(PATH_TO_SETTINGS), jsonParsed.toJson()) print(jsonParsed.toJson())
运行时错误
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()方法失败的原因是:CoreBindingsEnhancement类的appendGosuValue()方法未将Boolean视为受支持的expando类型,但Boolean是Java8种标准包装类型中唯一被排除的类型,其他包装类均可正常序列化。
解答
核心问题:是设计还是Bug?
这明显是程序Bug。
- JSON标准原生支持布尔值类型,
Boolean作为Java对应的数据类型,在JSON序列化场景下属于基础支持范畴。 - 其他7种Java基本类型包装类都能被
toJson()正常处理,唯独Boolean被遗漏,不符合API设计的一致性原则,不存在合理的设计理由排除该类型。
附加问题:为何无法定义为final?
在Gosu中,声明final变量需要将final关键字放在var之前,正确写法如下:
final var SETTING_NAME : String = "editor.guides.indentation" final var PATH_TO_SETTINGS : String = "C:\\Users\\Kamil Kurkiewicz\\AppData\\Roaming\\Code\\User\\settings.json"
若错误地将final放在变量名或类型之后,会触发语法错误,导致无法正常声明final变量。
内容的提问来源于stack exchange,提问作者Kamil Kurkiewicz
相关产品推荐
相关产品推荐

