Nim反序列化含Table[string, seq[string]]的类型时出现nnkBracketExpr错误如何解决?
问题原因
你遇到的报错是因为Nim标准库json模块的to泛型反序列化方法,默认没有为Table泛型类型提供对应的反序列化实现,泛型展开阶段无法识别Table[string, seq[string]]这种带参数的泛型类型语法节点,所以抛出nnkBracketExpr相关错误。
解决方案
方案1:手动实现自定义反序列化逻辑(无额外依赖,最稳妥)
不需要修改原有类型定义,自己编写Response类型的转换逻辑即可:
import json, tables type Response* = object name: string vers: string features: Table[string, seq[string]] proc toResponse(json: JsonNode): Response = result.name = json["name"].getStr() result.vers = json["vers"].getStr() result.features = initTable[string, seq[string]]() # 遍历JSON的features字段的所有键值对 for key, valNode in json["features"]: # 把值的JSON数组转成字符串序列 result.features[key] = valNode.getElems().map(it.getStr()) # 调用示例 let json = parseJson(text) let test = toResponse(json)
方案2:为Table类型实现标准库反序列化适配(兼容原有调用方式)
如果你不想修改原有调用to(json, Response)的代码,可以手动给你用到的Table[string, seq[string]]类型实现fromJson方法:
import json, tables, sequtils # 先实现Table类型的反序列化适配 proc fromJson(T: type Table[string, seq[string]], json: JsonNode): Table[string, seq[string]] = result = initTable[string, seq[string]]() for k, v in json: result[k] = v.getElems().mapIt(it.getStr()) # 原有代码可直接运行 type Response* = object name: string vers: string features: Table[string, seq[string]] let json = parseJson(text) let test = to(json, Response)
方案3:使用支持Table类型的第三方序列化库(代码更简洁)
可以用生态中更完善的JSON序列化库jsony,它默认支持Table类型的序列化和反序列化,不需要额外写适配代码:
- 首先安装依赖:
nimble install jsony - 代码示例:
import jsony, tables type Response* = object name: string vers: string features: Table[string, seq[string]] # 直接从JSON文本反序列化,不需要先调用parseJson let test = text.fromJson(Response)
内容的提问来源于stack exchange,提问作者victorzki
相关产品推荐
相关产品推荐

