在Ballerina中修改JSON对象字段报错的解决方案问询
修改JSON对象version字段失败的解决方案
问题背景
我有以下需求:
- 从文件读取JSON对象;
- 修改该JSON对象中的单个字段;
- 将修改后的内容写回文件。
我的代码如下:
json packageJson = check io:fileReadJson(packageJsonPath); packageJson.'version = newVersion;
但在给version字段赋值时出现错误:
invalid operation: type 'json' does not support field access for assignment
我曾考虑将JSON转换为自定义类型,但需处理的多个JSON文件结构不固定(仅均包含version字段),请问是否有可行的解决办法或其他实现思路?
可行解决方案
在Ballerina里,json类型是不可变的,没法直接通过字段访问修改值。针对你这种仅固定存在version字段、整体结构不固定的场景,有两种实用方案:
方案1:用json:put()函数生成新JSON对象
Ballerina提供的json:put()函数可以基于原JSON对象创建一个包含修改后字段的新对象,代码示例:
import ballerina/io; import ballerina/json; public function main() returns error? { string packageJsonPath = "./package.json"; string newVersion = "1.0.1"; json packageJson = check io:fileReadJson(packageJsonPath); // 调用put修改version字段,得到新的JSON对象 json updatedJson = check json:put(packageJson, "version", newVersion); // 写回文件 check io:fileWriteJson(packageJsonPath, updatedJson); }
方案2:转换为map<anydata>类型修改后转回JSON
如果需要更灵活的字段操作,可以先把json转成map<anydata>(所有JSON对象都能安全转成这个类型),修改完成后再转回json:
import ballerina/io; public function main() returns error? { string packageJsonPath = "./package.json"; string newVersion = "1.0.1"; json packageJson = check io:fileReadJson(packageJsonPath); // 转换为map类型 map<anydata> jsonMap = check packageJson.ensureType(); // 直接修改version字段 jsonMap["version"] = newVersion; // 转回json类型 json updatedJson = jsonMap; // 写回文件 check io:fileWriteJson(packageJsonPath, updatedJson); }
这两种方案都不需要定义固定的自定义类型,完全适配你处理多种结构JSON文件的需求。
内容的提问来源于stack exchange,提问作者Tharindu Weerasinghe
相关产品推荐
相关产品推荐

