我为解析JSON字符串编写了一些代码。 我有时会得到“Bad Cast Exception”。 在我的JSON字符串 1中。 2. 不引发异常并且 3。 4。引发异常。
两组之间的差异是 1。 2。的BCodeW在范围很长且 3。 4,的BCodeW在Int64范围内。
为什么演员会引发异常呢?
我为Bad Cast Exception写了一些守卫代码,但我想知道异常的原因。
感谢阅读。
我的环境如下。
我的JSON字符串示例如下。
我的代码如下。
bool CUBIUtils::ParseAddressResult( llong& _BCodeW, char* _szPOI, char* _szJibun, char* _szAPIResult )
{
JSON::Parser parser;
try
{
JSON::Object::Ptr _object = parser.parse(_szAPIResult).extract<JSON::Object::Ptr>();
if ( NULL == _object)
{
formatlog( LOG_ERROR, "JSON parsing failed");
return false;
}
formatlog( LOG_DEBUG, "CUBIUtils::%s(%d) AddrSrc: %s", __func__, __LINE__, _szAPIResult);
_BCodeW = 0;
try
{
_BCodeW = _object->get("BCodeW").extract<Int64>();
}
catch(exception &_e)
{
_BCodeW = _object->get("BCodeW").extract<int>();
}
strcpy( _szPOI, _object->get("poi").extract<std::string>().c_str());
strcpy( _szJibun, _object->get("jibun").extract<std::string>().c_str());
}
catch(exception &e)
{
formatlog( LOG_ERROR, "CUBIUtils::%s(%d) JSON parsing Exception. %s", __func__, __LINE__, e.what());
return false;
}
return true;
}
Poco源代码中的Var.h说。
/// Invoke this method to perform a safe conversion. /// /// Example usage: /// Var any("42"); /// int i = any.convert<int>(); /// /// Throws a RangeException if the value does not fit /// into the result variable. /// Throws a NotImplementedException if conversion is /// not available for the given type. /// Throws InvalidAccessException if Var is empty.
以下代码有效。
使用convert<T>()
代替extract<T>()
数据类型不同。 “我”,“我”
extract
获取完全匹配类型的数据。
_BCodeW = 0;
if ( _object->isNull("BCodeW"))
cout << "BCodeW is NULL" << endl;
else
{
Dynamic::Var _BCodeWVar = _object->get("BCodeW");
cout << "Data Type is " << _BCodeWVar.type().name() << endl;
_BCodeW = _BCodeWVar.convert<Int64>();
cout << "BCodeW is " << _BCodeW << endl;
}
答案 0 :(得分:3)
这里的问题不在于JSON解析和/或数据提取。它在比较行中:
if (NULL == _object)
该行将导致抛出BadCastException。
原因是因为operator==
解析为
inline bool operator == (const Poco::Int32& other, const Var& da)
以及Poco::JSON::Object::Ptr
Poco::Int32
的{{3}}投掷。
用
替换有问题的行if (_object.isNull())
一切都会好的。