JObject.GetValue取值时如何仅在值存在时调用ToString()并规避异常
优雅处理JObject取值的空值问题
嘿,这个场景我日常开发中经常碰到!确实,每次都写if判空太繁琐了,这里有几个更简洁巧妙的实现方式,完全不用显式写空判断:
1. 用null条件运算符+空合并运算符(最简洁)
C# 6及以上版本支持的?.(null条件运算符)和??(空合并运算符)可以完美解决这个问题,一行代码搞定:
JObject exampleJobject = new JObject(); string text = exampleJobject.GetValue("text")?.ToString() ?? "";
?.会先检查GetValue("text")的返回值是否为null,如果是null就直接返回null,不会执行后面的ToString();如果不为null,就正常调用ToString()。??会把前面的null结果替换成你想要的默认值(这里是空字符串),你也可以改成其他默认值比如"N/A"。
你甚至可以直接用JObject的索引器代替GetValue(),代码更短:
string text = exampleJobject["text"]?.ToString() ?? "";
2. 借助Convert.ToString()
Convert.ToString()方法本身就会处理null的情况,当传入null时它会返回空字符串,刚好符合需求:
string text = Convert.ToString(exampleJobject.GetValue("text"));
这个方法的好处是代码更短,而且不需要记两个运算符的组合,不过如果你的默认值不是空字符串的话,还是需要配合??使用,比如:
string text = Convert.ToString(exampleJobject.GetValue("text")) ?? "默认值";
3. 封装扩展方法(适合频繁使用的场景)
如果你的项目里经常需要做这种操作,可以封装一个扩展方法,把逻辑复用起来:
public static class JObjectExtensions { public static string GetString(this JObject jObject, string key, string defaultValue = "") { return jObject.GetValue(key)?.ToString() ?? defaultValue; } }
之后调用的时候就非常清爽了:
string text = exampleJobject.GetString("text"); // 或者指定自定义默认值 string textWithDefault = exampleJobject.GetString("text", "未找到内容");
这些方法都能帮你完全规避掉那种繁琐的显式if判空写法,代码更简洁易读,也更符合现代C#的编码风格~
内容的提问来源于stack exchange,提问作者Noah Ispas
相关产品推荐
相关产品推荐

