在 UniAppX 中使用 UTS 渲染你提供的这种嵌套 JSON 数据时,遇到 msg.msg_body.body.body无法访问的问题,通常是因为 UTS 的强类型特性导致的。你不能像在 JS 中那样直接访问未定义类型的深层嵌套属性。
下面提供两种解决方案,推荐使用方案一。
方案一:使用 UTSJSONObject和 KeyPath 安全访问(推荐用于复杂或不确定的结构)
对于嵌套较深或结构复杂的数据,使用 UTSJSONObject的 keypath方法可以更安全地访问。
将列表数据声明为 UTSJSONObject数组:这样我们就可以利用 UTS 提供的工具方法来访问数据。
使用 getString(或其他对应类型的方法) 和 KeyPath 访问:KeyPath 允许你使用字符串路径直接访问深层属性。
<template>
<view>
<!-- 遍历 list 数组 -->
<view v-for="(msg, index) in list" :key="index">
<!--
使用 UTSJSONObject 的 getString 方法并通过 KeyPath 访问深层属性。
KeyPath 字符串 'msg_body.body.body' 表示访问 msg['msg_body']['body']['body']
-->
{{ (msg as UTSJSONObject).getString('msg_body.body.body') }}
</view>
</view>
</template>
// 假设你的 list 数据是从网络或其他地方获取的,类型为 any 或 UTSJSONObject[]
// 在 data 中声明时,可以将其定义为 UTSJSONObject[] 类型
export default {
data() {
return {
// 将 list 初始化为 UTSJSONObject 数组
list: [] as UTSJSONObject[],
}
},
onLoad() {
// 假设这是你的原始数据
const originList = [{
"conv_id": "1951214682791092224",
"msg_body": {
"type": "im",
"scope": "im",
"body": {
"msgType": "im.social.pr",
"body": "你好呀",
"style": "",
"env": "group:1951214682791092224"
}
}
},
{
"conv_id": "1951214682791092224",
"msg_body": {
"type": "im",
"scope": "im",
"body": {
"msgType": "im.social.pr",
"body": "你好呀",
"style": "",
"env": "group:1951214682791092224"
}
}
}];
// 将原始数据转换为 UTSJSONObject 数组并赋值给 list
// 这里使用 as UTSJSONObject[] 进行类型断言
this.list = originList as UTSJSONObject[];
}
}