diff --git a/3party/jansson/myjansson.hpp b/3party/jansson/myjansson.hpp index 422f4a402d..7e8d1600de 100644 --- a/3party/jansson/myjansson.hpp +++ b/3party/jansson/myjansson.hpp @@ -76,6 +76,20 @@ json_t const * GetJSONObligatoryField(json_t const * root, char const * field); json_t * GetJSONOptionalField(json_t * root, std::string const & field); json_t * GetJSONOptionalField(json_t * root, char const * field); json_t const * GetJSONOptionalField(json_t const * root, char const * field); + +template +inline json_t const * GetJSONObligatoryFieldByPath(json_t const * root, First path, Paths... paths) +{ + json_t const * newRoot = GetJSONObligatoryFieldByPath(root, path); + return GetJSONObligatoryFieldByPath(newRoot, paths...); +} + +template <> +inline json_t const * GetJSONObligatoryFieldByPath(json_t const * root, char const * path) +{ + return GetJSONObligatoryField(root, path); +} + bool JSONIsNull(json_t const * root); } // namespace base diff --git a/generator/geo_objects/geo_objects.cpp b/generator/geo_objects/geo_objects.cpp index 504376f269..0c9060d513 100644 --- a/generator/geo_objects/geo_objects.cpp +++ b/generator/geo_objects/geo_objects.cpp @@ -46,8 +46,9 @@ using IndexReader = ReaderPtr; bool HouseHasAddress(JsonValue const & json) { - auto && properties = base::GetJSONObligatoryField(json, "properties"); - auto && address = base::GetJSONObligatoryField(properties, "address"); + auto && address = + base::GetJSONObligatoryFieldByPath(json, "properties", "locales", "default", "address"); + auto && building = base::GetJSONOptionalField(address, "building"); return building && !base::JSONIsNull(building); } @@ -154,9 +155,8 @@ void FilterAddresslessByCountryAndRepackMwm(std::string const & pathInGeoObjects if (!regionKeyValue) return; - auto && properties = base::GetJSONObligatoryField(*regionKeyValue->second, "properties"); - auto && address = base::GetJSONObligatoryField(properties, "address"); - auto && country = base::GetJSONObligatoryField(address, "country"); + auto && country = base::GetJSONObligatoryFieldByPath( + *regionKeyValue->second, "properties", "locales", "default", "address", "country"); auto countryName = FromJSON(country); auto pos = includeCountries.find(countryName); if (pos != std::string::npos) diff --git a/generator/streets/streets_builder.cpp b/generator/streets/streets_builder.cpp index 07f17f6226..80369a574e 100644 --- a/generator/streets/streets_builder.cpp +++ b/generator/streets/streets_builder.cpp @@ -138,8 +138,8 @@ boost::optional StreetsBuilder::FindStreetRegionOwner(m2::PointD const bool needLocality) { auto const isStreetAdministrator = [needLocality](KeyValue const & region) { - auto const && properties = base::GetJSONObligatoryField(*region.second, "properties"); - auto const && address = base::GetJSONObligatoryField(properties, "address"); + auto && address = base::GetJSONObligatoryFieldByPath(*region.second, "properties", "locales", + "default", "address"); if (base::GetJSONOptionalField(address, "suburb")) return false; @@ -166,9 +166,9 @@ base::JSONPtr StreetsBuilder::MakeStreetValue(uint64_t regionId, JsonValue const m2::RectD const & bbox, m2::PointD const & pinPoint) { auto streetObject = base::NewJSONObject(); + auto && regionAddress = base::GetJSONObligatoryFieldByPath(regionObject, "properties", "locales", + "default", "address"); - auto const && regionProperties = base::GetJSONObligatoryField(regionObject, "properties"); - auto const && regionAddress = base::GetJSONObligatoryField(regionProperties, "address"); auto address = base::JSONPtr{json_deep_copy(const_cast(regionAddress))}; ToJSONObject(*address, "street", streetName);