如何在C#中使用Newtonsoft.Json将JSON转数组并提取指定sms值
提取杂乱JSON中的
sms:+9230154XXXXX值(Newtonsoft.Json实现) 我太懂面对结构混乱的JSON时那种无从下手的感觉了!既然你用的是Newtonsoft.Json,咱们不用硬套强类型模型,用动态解析或者递归查找的方式就能精准揪出你要的sms:+格式值。
方法一:递归遍历所有节点(适合完全杂乱的JSON)
如果完全摸不清JSON的层级结构,直接遍历所有字符串类型的节点,筛选出以sms:开头的值就行:
using Newtonsoft.Json.Linq; // 假设你的JSON字符串存在jsonStr变量里 JObject jsonObj = JObject.Parse(jsonStr); // 递归查找所有字符串值,筛选符合格式的 var smsValue = jsonObj.Descendants() .OfType<JValue>() .Where(v => v.Type == JTokenType.String && v.Value.ToString().StartsWith("sms:")) .Select(v => v.Value.ToString()) .FirstOrDefault(); // 输出结果 if (!string.IsNullOrEmpty(smsValue)) { Console.WriteLine($"找到目标值:{smsValue}"); } else { Console.WriteLine("未找到符合格式的sms值"); }
方法二:已知大致路径时用SelectToken(更高效)
如果你能记住目标值所在的大致层级(比如在某个嵌套对象的contact或phone字段下),可以用SelectToken直接定位,避免全量遍历:
// 假设目标值在$.data.user.contact这个路径下(示例路径,根据你的实际JSON调整) var smsValue = jsonObj.SelectToken("$.data.user.contact")?.Value<string>(); // 或者用通配符匹配不确定的层级,比如: var smsValue = jsonObj.SelectToken("$..[?(@.StartsWith('sms:'))]")?.Value<string>();
小提示
如果你的JSON里可能有多个sms:格式的值,把FirstOrDefault()换成ToList()就能拿到所有匹配结果。另外,记得处理空值情况,避免空引用异常。
内容的提问来源于stack exchange,提问作者Owais Iqbal
相关产品推荐
相关产品推荐

