使用Json.NET检索C#中可能不存在的JSON值的最佳做法是什么?
现在我正在处理一个JSON提供程序,它返回有时包含某些键/值对的JSON,有时则不然。我一直在使用(可能不正确)这个方法来获取我的值(例如获得一个双倍):
if(null != jToken["width"])
width = double.Parse(jToken["width"].ToString());
else
width = 100;
现在工作正常,但是当它们很多时,它很麻烦。我最后编写了一个扩展方法,只有在之后编写它我不知道是否可能我是傻...反正这里是扩展方法(我只包括double和string的情况,但是实际上我还有很多):
public static T GetValue<T>(this JToken jToken, string key,
T defaultValue = default(T))
{
T returnValue = defaultValue;
if (jToken[key] != null)
{
object data = null;
string sData = jToken[key].ToString();
Type type = typeof(T);
if (type is double)
data = double.Parse(sData);
else if (type is string)
data = sData;
if (null == data && type.IsValueType)
throw new ArgumentException("Cannot parse type \"" +
type.FullName + "\" from value \"" + sData + "\"");
returnValue = (T)Convert.ChangeType(data,
type, CultureInfo.InvariantCulture);
}
return returnValue;
}
以下是使用扩展方法的示例:
width = jToken.GetValue<double>("width", 100);
顺便说一句,请原谅可能是一个非常愚蠢的问题,因为它似乎应该有一个内置函数...我确实尝试了Google和Json.NET文档,但是我要么不合适找到我的问题的解决方案或在文档中不清楚。
答案 0 :(得分:181)
这几乎是泛型方法Value()
的用途。如果将它与可空值类型和??
运算符组合,您将获得所需的行为:
width = jToken.Value<double?>("width") ?? 100;
答案 1 :(得分:17)
我会写GetValue
如下
public static T GetValue<T>(this JToken jToken, string key, T defaultValue = default(T))
{
dynamic ret = jToken[key];
if (ret == null) return defaultValue;
if (ret is JObject) return JsonConvert.DeserializeObject<T>(ret.ToString());
return (T)ret;
}
通过这种方式,您不仅可以获得基本类型的值,还可以获得复杂对象的值。这是一个样本
public class ClassA
{
public int I;
public double D;
public ClassB ClassB;
}
public class ClassB
{
public int I;
public string S;
}
var jt = JToken.Parse("{ I:1, D:3.5, ClassB:{I:2, S:'test'} }");
int i1 = jt.GetValue<int>("I");
double d1 = jt.GetValue<double>("D");
ClassB b = jt.GetValue<ClassB>("ClassB");
答案 2 :(得分:4)
以下是检查令牌是否存在的方法:
if (jobject["Result"].SelectToken("Items") != null) { ... }
检查“结果”中是否存在“项目”。
这是一个导致异常的非工作示例:
if (jobject["Result"]["Items"] != null) { ... }
答案 3 :(得分:2)
您可以简单地进行类型转换,它将为您进行转换,例如
var with = (double?) jToken[key] ?? 100;
如果对象中不存在所述键,它将自动返回null
,因此无需对其进行测试。
答案 4 :(得分:1)
TYPE variable = jsonbody["key"]?.Value<TYPE>() ?? DEFAULT_VALUE;
e.g。
bool attachMap = jsonbody["map"]?.Value<bool>() ?? false;
答案 5 :(得分:1)
这会处理空值
var body = JObject.Parse("anyjsonString");
body?.SelectToken("path-string-prop")?.ToString();
body?.SelectToken("path-double-prop")?.ToObject<double>();