JsonElement和空条件运算符(KeyNotFoundException)

d4so4syb  于 2023-02-14  发布在  其他
关注(0)|答案(3)|浏览(146)

我有一个JSON对象,我从API获得,我需要检查JSON响应中的错误。然而,当没有错误时,错误值不存在。还请注意,API不可靠,我无法从中创建POCO,这是不可能的。
因此,我得到了KeyNotFoundException,在处理深度嵌套的JsonElement时,是否有办法使用某种条件运算符(即“Elvis”运算符)?
我试着做?.GetProperty,但它说Operator '?' cannot be applied to operand of type 'JsonElement'
那么我的选择是什么呢?在这个例子中,我真的必须TryGetProperty并创建3个变量吗?如果我的JSON嵌套得更深,我必须为每个嵌套创建变量,然后检查它是否为null?看起来有点荒谬,必须有另一种方法。
这里还有一个关于GitHub上这个主题的老问题。(https://github.com/dotnet/runtime/issues/30450)我想也许有人知道一些解决这个问题的方法。
例如,下面是我的代码:

var isError = !string.IsNullOrEmpty(json.RootElement.GetProperty("res")
    .GetProperty("error")
    .GetProperty("message")
    .GetString()); // Throws KeyNotFoundException when `error` or `message` or `res` is not there
r1zhe5dt

r1zhe5dt1#

你可以写一个扩展方法,如果找不到属性,它会返回Nullable<JsonElement>,如下所示

public static class JsonElementExtenstion
{
    public static JsonElement? GetPropertyExtension(this JsonElement jsonElement, string propertyName)
    {
        if (jsonElement.TryGetProperty(propertyName, out JsonElement returnElement))
        {
            return returnElement;
        }
        
        return null;
    }
}

现在可以在代码中应用运算符?.

var isError = !string.IsNullOrEmpty(json.RootElement.GetPropertyExtension("res")
    ?.GetPropertyExtension("error")
    ?.GetPropertyExtension("message")
    ?.GetString());

看看这个dotnet fidle,它复制了扩展方法-https://dotnetfiddle.net/S6ntrt的用法

9wbgstp7

9wbgstp72#

这样比较正确。

public static JsonElement? GetPropertyExtension(this JsonElement jsonElement, string propertyName)
    {
        if (jsonElement.ValueKind == JsonValueKind.Null)
        {
            return null;
        }
        if (jsonElement.TryGetProperty(propertyName, out JsonElement returnElement))
        {
            return returnElement;
        }

        return null;
    }
9gm1akwq

9gm1akwq3#

经过测试,我的答案越来越正确... XD

public static class JsonElementExtenstion
{
    public static JsonElement? GetPropertyNullable(this JsonElement jsonElement, string propertyName)
    {
        if (jsonElement.TryGetProperty(propertyName, out JsonElement returnElement))
        {
            if (returnElement.ValueKind == JsonValueKind.Null)
            {
                return null;
            }
            
            return returnElement;
        }

        return null;
    }
}

相关问题