You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.07 19:13:09