使用 'as' 运算符转换 Nil TJSONValue 时出错

Error when casting Nil TJSONValue using 'as' operator

我偶然发现了一个让我大吃一惊的错误,所以我想问问你这是否有意义...

Item := Songs.Items[Index] as TJSONObject;
ThisTrack := Item.Values['track'] as TJSONObject;
if (Assigned(ThisTrack)) then Begin;

End; 

SongsTJSONArrayItemThisTrackTJSONObject

如果 Item 不包含“track”,上面的代码会在第 2 行抛出一个 ERangeError 异常。

这是我第一次看到这个,我非常确定,我过去有很多“NIL AS ”。

这是 JSON-class 的具体问题吗?

解决方法真的如下吗?

ThisTrack: TJSONValue;

Item := Songs.Items[Index] as TJSONObject;
ThisTrack := Item.Values['track'];
If Assigned(ThisTrack) then Begin;
  Tracks := (ThisTrack as TJSONObject).Values['uri'].Value);

如果找不到请求的 child,TJSONObject.Values[] 属性 return 是一个 nil 指针。

如果给定一个 nil 指针,as 运算符不会引发异常,它将 return 一个 nil 指针。因此,无论您是否投射,在访问可能存在或可能不存在的 object 之前,您仍然需要检查 nil

关于 ERangeError 异常,您无法在 Item.Values['track'] as TJSONObject 表达式中得到该错误,正如您所指出的那样。但是如果 Index 超出范围,你可以从 Songs.Items[Index] 表达式中得到它。

此外,您在 Begin 之后有一个错误的 ;,您需要将其删除。