Azure Cosmos DB SQL:如何去除内部JSON属性的转义字符以实现查询
解决转义JSON字符串解析问题
看起来你碰到的是很常见的嵌套JSON被转义成字符串的问题——设备把本该是对象的Gateway_Info序列化成了带转义符的字符串,导致没法直接用点符号访问里面的属性。下面分两种场景给你实用的解决方案:
场景1:在数据库查询时直接解析(以Cosmos DB SQL为例)
从你的查询语句看,应该是在用Azure Cosmos DB的SQL语法。Cosmos DB提供了专门的函数来处理这种转义的JSON字符串:
- 如果只需要提取
Gateway_Info里的单个属性,用JSON_VALUE:SELECT c.Asset_Key, JSON_VALUE(c.Gateway_Info, '$.temp_sensor') AS temp_sensor, JSON_VALUE(c.Gateway_Info, '$.gw_fw_version') AS gw_fw_version FROM c WHERE c.Asset_Key = '1' - 如果要把整个
Gateway_Info解析成可直接访问的嵌套对象,用JSON_QUERY:SELECT c.*, JSON_QUERY(c.Gateway_Info) AS Parsed_Gateway_Info FROM c WHERE c.Asset_Key = '1'
查询结果里的Parsed_Gateway_Info就是正常的JSON对象,直接用点符号访问属性就行。
场景2:在应用代码中解析(常用语言示例)
如果是拿到数据库返回的数据后在代码里处理,不同语言都有成熟的方法把转义字符串转成对象:
JavaScript/TypeScript
// 假设从数据库拿到的原始数据是data const parsedGatewayInfo = JSON.parse(data.Gateway_Info); // 现在可以直接访问属性 console.log(parsedGatewayInfo.temp_pcb); // 输出82.00
Python
import json # 模拟从数据库获取的原始数据 raw_data = { "Asset_Key": "1", "Gateway_Info": "{\"temp_sensor\":0.00,\"temp_pcb\":82.00,\"gw_fw_version\":\"0.0.0\"}" } parsed_gateway = json.loads(raw_data["Gateway_Info"]) print(parsed_gateway["gw_fw_version"]) # 输出0.0.0
C#
using System.Text.Json; // 先定义对应的数据类 public class DeviceData { public string Asset_Key { get; set; } public string Gateway_Info { get; set; } // 其他属性... } public class GatewayInfo { public double temp_sensor { get; set; } public double temp_pcb { get; set; } public string gw_fw_version { get; set; } // 其他属性... } // 解析逻辑 var rawDeviceData = JsonSerializer.Deserialize<DeviceData>(jsonString); var parsedGateway = JsonSerializer.Deserialize<GatewayInfo>(rawDeviceData.Gateway_Info);
额外建议
如果条件允许,最好从源头解决问题——调整设备的发送逻辑,让Gateway_Info直接以JSON对象的格式发送,而不是转义后的字符串。这样后续所有处理环节都能省掉额外的解析步骤,避免不必要的麻烦。
内容的提问来源于stack exchange,提问作者RSH
相关产品推荐
相关产品推荐

