当我尝试转换Int64时,poco库上的错误转换异常

时间:2015-07-29 07:26:27

标签: c++ json exception casting poco-libraries

我为解析JSON字符串编写了一些代码。 我有时会得到“Bad Cast Exception”。 在我的JSON字符串 1中。 2. 不引发异常并且 3。 4。引发异常。

两组之间的差异是 1。 2。的BCodeW在范围很长且 3。 4,的BCodeW在Int64范围内。

为什么演员会引发异常呢?

我为Bad Cast Exception写了一些守卫代码,但我想知道异常的原因。

感谢阅读。

我的环境如下。

  • g ++(GCC)4.4.7 20120313(Red Hat 4.4.7-11)
  • poco-1.6.0(使用Poco :: JSON)
  • CentOS 6.6版(最终版)

我的JSON字符串示例如下。

  1. { “Y”:37.56376中, “x”:126.97287, “聚腺苷酸”:37.563686111111, “poiX”:126.97302222222, “jibunY”:37.563805555556, “jibunX”:126.97285833333, “BCodeW”:1114016700 中, “POI”: “... ”“ jibun ”:“ ...”}
  2. { “Y”:37.59771中, “x”:127.041493, “聚腺苷酸”:37.597605555556, “poiX”:127.041725, “jibunY”:37.597547222222, “jibunX”:127.04176666667, “BCodeW”:1129013600 中, “POI”: “... ”“ jibun ”:“ ...”}
  3. { “Y”:36.760035, “×”:127.250362, “聚腺苷酸”:36.759905555556, “poiX”:127.25036111111, “jibunY”:36.760119444444, “jibunX”:127.25040833333, “BCodeW”:4413125029 中, “POI”: “... ”“ jibun ”:“ ...”}
  4. { “Y”:36.129513, “×”:128.34381, “聚腺苷酸”:36.128672222222, “poiX”:128.34373888889, “jibunY”:36.129738888889, “jibunX”:128.34425833333, “BCodeW”:4719010200 中, “POI”: “... ”“ jibun ”:“ ...”}
  5. 我的代码如下。

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

1 个答案:

答案 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())

一切都会好的。