如何从oneM2M API的JSON响应中获取con节点下的dataFrame数据?
解决oneM2M API JSON响应中获取dataFrame为空的问题
你遇到的核心问题是没处理好JSON的嵌套层级,而且con字段本身是一个JSON格式的字符串,不是直接的对象,所以直接访问bin.dataFrame肯定拿不到值。咱们一步步来修正:
问题分析
先拆解你的JSON结构:
{ "m2m:cin": { // ...其他字段 "con": "{\"userid\":\"user1\",\"payloads_ul\":{\"id\":1526738533510,...\"dataFrame\":\"QUxJVkUqQkFUMzUw\"}}" } }
- 最外层是
m2m:cin对象,你得先定位到它; con是一个字符串,里面才包含payloads_ul和dataFrame,必须把这个字符串再反序列化一次才能访问内部字段。
修正后的动态类型代码
如果你想继续用dynamic快速实现,修改读取响应的部分即可:
using (var stream = resp.GetResponseStream()) { var reader = new StreamReader(stream, encoding); var responseString = reader.ReadToEnd(); // 1. 解析最外层JSON,获取m2m:cin对象 dynamic root = Newtonsoft.Json.JsonConvert.DeserializeObject(responseString); dynamic cinObject = root["m2m:cin"]; // 2. 取出con的JSON字符串,二次反序列化 string conJsonContent = cinObject.con.ToString(); dynamic conData = Newtonsoft.Json.JsonConvert.DeserializeObject(conJsonContent); // 3. 现在可以正确拿到dataFrame了 string dataFrameValue = conData.payloads_ul.dataFrame.ToString(); byte[] data = Convert.FromBase64String(dataFrameValue); }
更安全的实体类方案(推荐)
动态类型虽然方便,但编译时没有类型检查,容易出错。推荐定义对应实体类来解析,代码更健壮:
首先创建匹配JSON结构的实体类:
using Newtonsoft.Json; // 最外层响应类 public class OneM2MResponse { [JsonProperty("m2m:cin")] public CinEntry Cin { get; set; } } // m2m:cin节点类 public class CinEntry { public string con { get; set; } // 其他需要的字段(比如ty、ri等)可以在这里补充 } // con字段的内容类 public class ConContent { public string userid { get; set; } [JsonProperty("payloads_ul")] public PayloadsUl Payloads { get; set; } } // payloads_ul节点类 public class PayloadsUl { [JsonProperty("dataFrame")] public string DataFrame { get; set; } // 其他需要的字段可以补充 }
然后用实体类解析响应:
using (var stream = resp.GetResponseStream()) { var reader = new StreamReader(stream, encoding); var responseString = reader.ReadToEnd(); // 解析最外层响应 var apiResponse = JsonConvert.DeserializeObject<OneM2MResponse>(responseString); // 解析con字段的JSON字符串 var conContent = JsonConvert.DeserializeObject<ConContent>(apiResponse.Cin.con); // 获取dataFrame string dataFrame = conContent.Payloads.DataFrame; byte[] data = Convert.FromBase64String(dataFrame); }
内容的提问来源于stack exchange,提问作者krishna mohan
相关产品推荐
相关产品推荐

