如何在Monkey C(Connect IQ)中遍历嵌套对象并访问数组元素?
Monkey C 访问嵌套JSON结构的解决方案
问题分析
你当前的代码仅能处理顶层的基本类型值,当遇到data这种嵌套的Dictionary(对应JSON的对象)或Array(对应JSON的数组)时,直接打印会输出对象引用而非具体内容。Monkey C完全支持深度访问嵌套的数据结构,只需逐层判断类型并解析即可。
实现思路
- 编写递归辅助函数,处理不同类型的变量:对Dictionary和Array进行遍历解析,基本类型直接转换为字符串。
- 逐层访问嵌套结构时,先判断当前层级的变量类型(是否为Dictionary/Array),再继续向下访问,避免类型不匹配导致的运行时错误。
修改后的代码
辅助格式化函数
// 递归格式化任意类型的值为可读字符串 function formatValue(value) { if (value instanceof Dictionary) { var str = "{\n"; var keys = value.keys(); for (var i = 0; i < keys.size(); i++) { var key = keys[i]; str += " " + key + ": " + formatValue(value[key]) + ",\n"; } // 移除最后一个多余的逗号 if (str.length > 2) { str = str.substring(0, str.length - 2) + "\n"; } str += "}"; return str; } else if (value instanceof Array) { var str = "[\n"; for (var i = 0; i < value.size(); i++) { str += " " + formatValue(value[i]) + ",\n"; } if (str.length > 2) { str = str.substring(0, str.length - 2) + "\n"; } str += "]"; return str; } else { // 基本类型直接转为字符串 return value.toString(); } }
主逻辑代码
if (args instanceof Dictionary) { _message = ""; var keys = args.keys(); // 遍历顶层所有键值对并格式化 for (var i = 0; i < keys.size(); i++) { var key = keys[i]; var value = args[key]; _message += Lang.format("$1$: $2$\n", [key, formatValue(value)]); } // 单独示例:获取第一个设备的deviceName if (args.containsKey("data")) { var dataDict = args["data"]; if (dataDict instanceof Dictionary && dataDict.containsKey("devices")) { var devicesArray = dataDict["devices"]; if (devicesArray instanceof Array && devicesArray.size() > 0) { var firstDevice = devicesArray[0]; if (firstDevice instanceof Dictionary && firstDevice.containsKey("deviceName")) { _message += "\n第一个设备名称: " + firstDevice["deviceName"] + "\n"; } } } } }
说明
- 辅助函数
formatValue可以递归解析所有嵌套的结构,让data的内容能完整打印出来。 - 单独获取
deviceName的代码块展示了安全访问嵌套结构的方式:每一层都先判断类型和键是否存在,确保代码不会因数据结构异常崩溃。
内容的提问来源于stack exchange,提问作者TimothyLuedtke
相关产品推荐
相关产品推荐

