如何从JSON字符串解析name变量?C#代码抛空引用异常求助
问题排查与解决
报错原因分析
你遇到的Object reference not set to an instance of an object空引用异常,主要是以下两种情况导致:
- 变量
json本身是空值、空字符串,或是没有正确传入目标JSON内容; - 若
JObject.Parse(json)因JSON格式错误执行失败,会导致后续SelectToken("data")返回null,调用ToString()时触发异常。
另外你的代码写法存在冗余:不需要反复将JSON节点转成字符串再重新Parse,这既低效又容易引入错误。
正确实现代码
方式1:直接链式导航到目标节点
可以一步定位到name,无需多次Parse:
// 确保json变量已正确赋值为目标JSON字符串 JObject jsonObj = JObject.Parse(json); // 直接通过路径访问数组第一个元素的name,空条件运算符避免空引用 string name = jsonObj.SelectToken("data.items[0].name")?.ToString();
方式2:分步验证节点存在性
如果需要逐节点确认是否存在,可采用这种写法:
JObject jsonObj = JObject.Parse(json); JToken dataToken = jsonObj["data"]; if (dataToken != null) { JToken itemsToken = dataToken["items"]; if (itemsToken is JArray itemsArray && itemsArray.Count > 0) { string name = itemsArray[0]["name"]?.ToString(); // 后续使用name变量 } }
方式3:强类型序列化(规范做法)
如果需要频繁处理这类JSON,定义实体类通过序列化解析会更易维护:
// 定义对应实体类 public class RootObject { public DataModel Data { get; set; } public long AccountId { get; set; } } public class DataModel { public List<ItemModel> Items { get; set; } } public class ItemModel { public string Name { get; set; } } // 解析代码 RootObject root = JsonConvert.DeserializeObject<RootObject>(json); string name = root?.Data?.Items?.FirstOrDefault()?.Name;
关键排查步骤
- 确认
json变量内容:在JObject.Parse(json)前,打印或调试查看json的值,确保和目标JSON完全一致,无缺失或格式错误; - 检查Newtonsoft.Json包:确保引用了正确版本的Json.NET包,版本过低可能存在兼容性问题。
内容的提问来源于stack exchange,提问作者surfdmountain
相关产品推荐
相关产品推荐

