2017-08-04 139 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