diff --git a/3party/jansson/myjansson.cpp b/3party/jansson/myjansson.cpp index ed59a2c7a0..4b7ff97ca5 100644 --- a/3party/jansson/myjansson.cpp +++ b/3party/jansson/myjansson.cpp @@ -4,6 +4,17 @@ using namespace std; +namespace +{ +template +string FromJSONToString(json_t * root) +{ + T result; + FromJSON(root, result); + return strings::to_string(result); +} +} // namespace + namespace my { json_t * GetJSONObligatoryField(json_t * root, std::string const & field) @@ -38,6 +49,23 @@ void FromJSON(json_t * root, bool & result) result = json_is_true(root); } +string FromJSONToString(json_t * root) +{ + if (json_is_string(root)) + return FromJSONToString(root); + + if (json_is_integer(root)) + return FromJSONToString(root); + + if (json_is_real(root)) + return FromJSONToString(root); + + if (json_is_boolean(root)) + return FromJSONToString(root); + + MYTHROW(my::Json::Exception, ("Unexpected json type")); +} + namespace std { void FromJSON(json_t * root, string & result) diff --git a/3party/jansson/myjansson.hpp b/3party/jansson/myjansson.hpp index ecba88eb9b..2129ed1818 100644 --- a/3party/jansson/myjansson.hpp +++ b/3party/jansson/myjansson.hpp @@ -72,6 +72,8 @@ void FromJSON(json_t * root, T & result) result = static_cast(json_integer_value(root)); } +std::string FromJSONToString(json_t * root); + template void FromJSONObject(json_t * root, std::string const & field, T & result) { diff --git a/partners_api/booking_api.cpp b/partners_api/booking_api.cpp index b0dd18efcd..3f947ae493 100644 --- a/partners_api/booking_api.cpp +++ b/partners_api/booking_api.cpp @@ -129,7 +129,9 @@ vector ParsePhotos(json_t const * photosArray) for (size_t i = 0; i < sz; ++i) { auto item = json_array_get(photosArray, i); - FromJSON(item, photoId); + + // Sometimes booking.com returns photo ids as strings, sometimes as integers. + photoId = FromJSONToString(item); // First three digits of id are used as part of path to photo on the server. if (photoId.size() < 3)