LuaScript-KrakenD中如何将对象转为对象数组并正确返回?
KrakenD Lua脚本:将discount对象正确添加为D_OffersAddOn数组元素
在KrakenD的Lua序列化逻辑中,只有从1开始的连续整数索引的Lua表才会被解析为JSON数组,否则会被序列化为带键的JSON对象。你遇到的"0"键问题,就是因为表的索引不符合JSON数组的识别规则。
解决步骤
- 确保父结构存在:先检查
DocDetails是否已初始化,避免空引用错误。 - 初始化数组类型的D_OffersAddOn:直接用空表
{}初始化,不要指定0索引。 - 正确添加元素:使用
table.insert方法(自动从1开始填充索引),或者直接赋值索引1。
代码示例
方式1:动态添加到已有结构
-- 确保DocDetails节点存在 if not ngx.ctx.DocDetails then ngx.ctx.DocDetails = {} end -- 初始化D_OffersAddOn为数组(空表) if not ngx.ctx.DocDetails.D_OffersAddOn then ngx.ctx.DocDetails.D_OffersAddOn = {} end -- 将discount对象添加到数组末尾 table.insert(ngx.ctx.DocDetails.D_OffersAddOn, discount)
方式2:直接构建完整响应结构
-- 构建包含数组的响应体 local final_response = { DocDetails = { D_OffersAddOn = { discount } } } -- 将响应体传递给KrakenD(根据你的脚本场景调整,比如赋值给ngx.ctx.response) ngx.ctx.response = final_response
错误原因说明
- 如果你之前使用了
D_OffersAddOn[0] = discount这种方式,Lua表的索引从0开始,序列化时会被识别为JSON对象而非数组。 - 若用
set方法时传入了带指定键的表(比如{[0] = discount}),同样会生成带键的JSON对象。
预期输出格式
最终序列化后的JSON会符合你的需求:
{ "DocDetails": { "D_OffersAddOn": [ { /* discount对象的所有字段 */ } ] } }
内容的提问来源于stack exchange,提问作者Vishal M
相关产品推荐
相关产品推荐

