33
44#include " stdafx.h"
55#include " json_helpers.h"
6+ #include < cmath>
67
78namespace signalr
89{
9- signalr::value createValue (const web::json::value & v)
10+ signalr::value createValue (const Json::Value & v)
1011 {
1112 switch (v.type ())
1213 {
13- case web::json::value::Boolean:
14- return signalr::value (v.as_bool ());
15- case web::json::value::Number:
16- return signalr::value (v.as_double ());
17- case web::json::value::String:
18- return signalr::value (utility::conversions::to_utf8string (v.as_string ()));
19- case web::json::value::Array:
14+ case Json::ValueType::booleanValue:
15+ return signalr::value (v.asBool ());
16+ case Json::ValueType::realValue:
17+ case Json::ValueType::intValue:
18+ case Json::ValueType::uintValue:
19+ return signalr::value (v.asDouble ());
20+ case Json::ValueType::stringValue:
21+ return signalr::value (v.asString ());
22+ case Json::ValueType::arrayValue:
2023 {
21- auto & array = v.as_array ();
2224 std::vector<signalr::value> vec;
23- for (auto & val : array )
25+ for (auto & val : v )
2426 {
2527 vec.push_back (createValue (val));
2628 }
2729 return signalr::value (std::move (vec));
2830 }
29- case web::json::value::Object :
31+ case Json::ValueType::objectValue :
3032 {
31- auto & obj = v.as_object ();
3233 std::map<std::string, signalr::value> map;
33- for (auto & val : obj )
34+ for (const auto & val : v. getMemberNames () )
3435 {
35- map.insert ({ utility::conversions::to_utf8string ( val. first ) , createValue (val. second ) });
36+ map.insert ({ val, createValue (v[ val] ) });
3637 }
3738 return signalr::value (std::move (map));
3839 }
39- case web::json::value::Null :
40+ case Json::ValueType::nullValue :
4041 default :
4142 return signalr::value ();
4243 }
4344 }
4445
45- web::json::value createJson (const signalr::value& v)
46+ Json::Value createJson (const signalr::value& v)
4647 {
4748 switch (v.type ())
4849 {
4950 case signalr::value_type::boolean:
50- return web::json::value (v.as_bool ());
51+ return Json::Value (v.as_bool ());
5152 case signalr::value_type::float64:
52- return web::json::value (v.as_double ());
53+ {
54+ auto value = v.as_double ();
55+ double intPart;
56+ // Workaround for 1.0 being output as 1.0 instead of 1
57+ // because the server expects certain values to be 1 instead of 1.0 (like protocol version)
58+ if (std::modf (value, &intPart) == 0 )
59+ {
60+ return Json::Value ((int )intPart);
61+ }
62+ return Json::Value (v.as_double ());
63+ }
5364 case signalr::value_type::string:
54- return web::json::value ( utility::conversions::to_string_t ( v.as_string () ));
65+ return Json::Value ( v.as_string ());
5566 case signalr::value_type::array:
5667 {
5768 const auto & array = v.as_array ();
58- auto vec = std::vector<web::json::value>( );
69+ Json::Value vec (Json::ValueType::arrayValue );
5970 for (auto & val : array)
6071 {
61- vec.push_back (createJson (val));
72+ vec.append (createJson (val));
6273 }
63- return web::json::value::array ( vec) ;
74+ return vec;
6475 }
6576 case signalr::value_type::map:
6677 {
6778 const auto & obj = v.as_map ();
68- auto o = web::json::value::object ( );
79+ Json::Value object (Json::ValueType::objectValue );
6980 for (auto & val : obj)
7081 {
71- o[ utility::conversions::to_string_t ( val.first ) ] = createJson (val.second );
82+ object[ val.first ] = createJson (val.second );
7283 }
73- return o ;
84+ return object ;
7485 }
7586 case signalr::value_type::null:
7687 default :
77- return web::json::value::null ( );
88+ return Json::Value (Json::ValueType::nullValue );
7889 }
7990 }
91+
92+ Json::StreamWriterBuilder getJsonWriter ()
93+ {
94+ auto writer = Json::StreamWriterBuilder ();
95+ writer[" commentStyle" ] = " None" ;
96+ writer[" indentation" ] = " " ;
97+ return writer;
98+ }
99+
100+ std::unique_ptr<Json::CharReader> getJsonReader ()
101+ {
102+ auto builder = Json::CharReaderBuilder ();
103+ Json::CharReaderBuilder::strictMode (&builder.settings_ );
104+ std::unique_ptr<Json::CharReader> reader (builder.newCharReader ());
105+ return reader;
106+ }
80107}
0 commit comments