c# - 从 JToken 中获取可能不存在的值(value)(最佳实践)

标签 c# json.net

使用 Json.NET 检索甚至在 C# 中可能不存在的 JSON 值的最佳实践是什么? ?

现在我正在处理一个返回 JSON 的 JSON 提供程序,该 JSON 有时包含某些键/值对,有时不包含。我一直在使用(可能不正确)此方法来获取我的值(获取 double 值的示例):

if(null != jToken["width"])
    width = double.Parse(jToken["width"].ToString());
else
    width = 100;

现在这很好用,但是当它们很多时就很麻烦了。我最终写了一个扩展方法,只有写完之后我才怀疑我是否是愚蠢的......无论如何,这是扩展方法(我只包括 double 和字符串的情况,但是实际上我还有很多):

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);

顺便说一句,请原谅这可能是一个非常愚蠢的问题,因为看起来应该有一个内置函数......我试过谷歌,Json.NET文档,但是我要么无法找到我的问题的解决方案,要么在文档中不清楚。

最佳答案

这几乎就是通用方法 Value() 的内容是为了。如果将它与可空值类型和 ?? 运算符结合使用,您将获得所需的行为:

width = jToken.Value<double?>("width") ?? 100;

关于c# - 从 JToken 中获取可能不存在的值(value)(最佳实践),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9589218/

相关文章:

c# - 使用 HttpWebRequest 发布非英语数据

c# - 反序列化动态 JSON 响应

c# - 带有 Vector2Int 类型键的 JsonConvert 字典

c# - 从 WebApi 中的 snake case JSON 自动绑定(bind) pascal case c# 模型

azure - Microsoft.WindowsAzure.Storage (WindowsAzure.Storage) 9.1.1 在其依赖性之外调用 Newtonsoft 时失败

c# - Json.net:通过对象 Id 合并两个 json 数组

c# - 接受空 Lambda 表达式的函数的定义原型(prototype)

c# - 如何在 ASP.NET 图表控件中显示值

c# - 扫描图像 OpenCV 上的文档检测

c# - 如何根据单元格的值更改 WPF ListView 单元格中的字体颜色?