2017-08-04 138 views
-1

我想从一个JSON对象中取一个字符串,我知道它代表了一个十进制数,并将它分配给C++中的一个double。jsoncpp:将字符串转换为双倍

人们会预计asDouble()会完成这项工作,但事实并非如此。例如,如果我们(在C++ 11)的阵列["0.4983", "4387"]坐在变量Json::Value arr,做

double x = arr[0].asDouble() 

抛出一个异常Value is not convertible to double.

什么是这样做的推荐的方法?

+1

可能的复制。 com/questions/4754011/c-string-to-double-conversion) – Scheff

+0

当你这样尝试时会发生什么:'Json :: Value val = arr [0]; double x = val.asDouble();' –

+0

'arr.isArray()'的返回值是什么? –

回答

1

我的猜测是"0.4983"是一个字符串,所以jsoncpp拒绝将其转换为double。这是合理的,因为通常将诸如​​之类的字符串转换为双精度是没有意义的。

你需要的是手动将字符串转换为double;在C++ 11中,它将是stod

+0

这实际上是我目前正在做的。据我所知 - 请纠正我,如果我错了 - JSON不支持浮点数,只有整数。因此,Json中的任何十进制都必须用一个字符串表示,即用双引号括起来。考虑到在Json对象中传递小数的常见情况,我觉得jsoncpp应该提供一个函数来将字符串转换为双精度,如果不能进行转换就会抛出异常。毕竟,这正是第一次读入std :: string然后试图用std :: stod转换为double的时候会做的事情。 –

+0

Json支持浮点数;请参阅http://json.org/,我相信一个现代的json库会支持它。但是''“4.5”]是一个字符串数组,而''[4.5]''是一个浮点数组成的数组。 – scinart

+0

因此,基本上将浮点数字打包为Json字符串是一种糟糕的形式。只能希望数据提供者在某些时候会改变它,并且必须通过'std :: stod'进行转换,直到那时。谢谢 –

0

只是看看源:https://github.com/oftc/jsoncpp/blob/master/src/lib_json/json_value.cpp#L852

很显然,在jsoncpp只有intuintrealnullboolean可强制转换为doublestring不在列表中。

在这里有很多答案在stackoverflow exmplaining如何做你自己的字符串 - >双重转换。其中之一:C++ string to double conversion

此外,还有Value::isConvertibleTo()它允许你在运行时发现,如果一个值可以转换为类型://计算器:[C++字符串双转换(HTTPS的https://github.com/oftc/jsoncpp/blob/master/src/lib_json/json_value.cpp#L924