79 QJsonObject::const_iterator ait = loc.constFind(QLatin1String(
"Address"));
80 if (ait == loc.constEnd()) {
81 *errorString = QLatin1String(
"Expected Address element within Location object");
83 }
else if (!ait.value().isObject()) {
84 *errorString = QLatin1String(
"Expected Address object within Location object");
88 QJsonObject::const_iterator dpit = loc.constFind(QLatin1String(
"DisplayPosition"));
89 if (dpit == loc.constEnd()) {
90 *errorString = QLatin1String(
"Expected DisplayPosition element within Location object");
92 }
else if (!dpit.value().isObject()) {
93 *errorString = QLatin1String(
"Expected DisplayPosition object within Location object");
96 QJsonObject displayPosition = dpit.value().toObject();
97 QJsonObject::const_iterator latit = displayPosition.constFind(QLatin1String(
"Latitude"));
98 if (latit == displayPosition.constEnd()) {
99 *errorString = QLatin1String(
"Expected Latitude element within Location.DisplayPosition object");
101 }
else if (!latit.value().isDouble()) {
102 *errorString = QLatin1String(
"Expected Latitude double within Location.DisplayPosition object");
105 QJsonObject::const_iterator lonit = displayPosition.constFind(QLatin1String(
"Longitude"));
106 if (lonit == displayPosition.constEnd()) {
107 *errorString = QLatin1String(
"Expected Longitude element within Location.DisplayPosition object");
109 }
else if (!lonit.value().isDouble()) {
110 *errorString = QLatin1String(
"Expected Longitude double within Location.DisplayPosition object");
114 QJsonObject::const_iterator mvit = loc.constFind(QLatin1String(
"MapView"));
115 if (mvit == loc.constEnd()) {
116 *errorString = QLatin1String(
"Expected MapView element within Location object");
118 }
else if (!mvit.value().isObject()) {
119 *errorString = QLatin1String(
"Expected MapView object within Location object");
122 QJsonObject mapView = mvit.value().toObject();
123 QJsonObject::const_iterator brit = mapView.constFind(QLatin1String(
"BottomRight"));
124 if (brit == mapView.constEnd()) {
125 *errorString = QLatin1String(
"Expected BottomRight element within Location.MapView object");
127 }
else if (!brit.value().isObject()) {
128 *errorString = QLatin1String(
"Expected BottomRight object within Location.MapView object");
131 QJsonObject bottomRight = brit.value().toObject();
132 QJsonObject::const_iterator brlatit = bottomRight.constFind(QLatin1String(
"Latitude"));
133 if (brlatit == bottomRight.constEnd()) {
134 *errorString = QLatin1String(
"Expected Latitude element within Location.MapView.BottomRight object");
136 }
else if (!brlatit.value().isDouble()) {
137 *errorString = QLatin1String(
"Expected Latitude double within Location.MapView.BottomRight object");
140 QJsonObject::const_iterator brlonit = bottomRight.constFind(QLatin1String(
"Longitude"));
141 if (brlonit == bottomRight.constEnd()) {
142 *errorString = QLatin1String(
"Expected Longitude element within Location.MapView.BottomRight object");
144 }
else if (!brlonit.value().isDouble()) {
145 *errorString = QLatin1String(
"Expected Longitude double within Location.MapView.BottomRight object");
148 QJsonObject::const_iterator tlit = mapView.constFind(QLatin1String(
"TopLeft"));
149 if (tlit == mapView.constEnd()) {
150 *errorString = QLatin1String(
"Expected TopLeft element within Location.MapView object");
152 }
else if (!tlit.value().isObject()) {
153 *errorString = QLatin1String(
"Expected TopLeft object within Location.MapView object");
156 QJsonObject topLeft = tlit.value().toObject();
157 QJsonObject::const_iterator tllatit = topLeft.constFind(QLatin1String(
"Latitude"));
158 if (tllatit == topLeft.constEnd()) {
159 *errorString = QLatin1String(
"Expected Latitude element within Location.MapView.TopLeft object");
161 }
else if (!tllatit.value().isDouble()) {
162 *errorString = QLatin1String(
"Expected Latitude double within Location.MapView.TopLeft object");
165 QJsonObject::const_iterator tllonit = topLeft.constFind(QLatin1String(
"Longitude"));
166 if (tllonit == bottomRight.constEnd()) {
167 *errorString = QLatin1String(
"Expected Longitude element within Location.MapView.TopLeft object");
169 }
else if (!tllonit.value().isDouble()) {
170 *errorString = QLatin1String(
"Expected Longitude double within Location.MapView.TopLeft object");
216 if (!doc.isObject()) {
217 *errorString = QLatin1String(
"Expected JSON document containing object");
221 QJsonObject rootObject = doc.object();
222 QJsonObject::const_iterator it = rootObject.constFind(QLatin1String(
"Response"));
223 if (it == rootObject.constEnd()) {
224 *errorString = QLatin1String(
"Expected Response element within root object");
226 }
else if (!it.value().isObject()) {
227 *errorString = QLatin1String(
"Expected Response object within root object");
231 QJsonObject response = it.value().toObject();
232 QJsonObject::const_iterator rit = response.constFind(QLatin1String(
"View"));
233 if (rit == response.constEnd()) {
234 *errorString = QLatin1String(
"Expected View element within Response object");
236 }
else if (!rit.value().isArray()) {
237 *errorString = QLatin1String(
"Expected View array within Response object");
241 const QJsonArray view = rit.value().toArray();
242 for (
const QJsonValueConstRef viewElement : view) {
243 if (!viewElement.isObject()) {
244 *errorString = QLatin1String(
"Expected View array element to be object");
248 QJsonObject viewObject = viewElement.toObject();
249 QJsonObject::const_iterator voit = viewObject.constFind(QLatin1String(
"Result"));
250 if (voit == viewObject.constEnd()) {
251 *errorString = QLatin1String(
"Expected Result element within View array object element");
253 }
else if (!voit.value().isArray()) {
254 *errorString = QLatin1String(
"Expected Result array within View array object element");
258 const QJsonArray result = voit.value().toArray();
259 for (
const QJsonValueConstRef resultElement : result) {
260 if (!resultElement.isObject()) {
261 *errorString = QLatin1String(
"Expected Result array element to be object");
265 QJsonObject resultObject = resultElement.toObject();
266 QJsonObject::const_iterator roit = resultObject.constFind(
"Location");
267 if (roit == resultObject.constEnd()) {
268 *errorString = QLatin1String(
"Expected Location element in Result array element object");
270 }
else if (!roit.value().isObject()) {
271 *errorString = QLatin1String(
"Expected Location object in Result array element object");
275 QJsonObject location = roit.value().toObject();
276 if (!checkLocation(location, errorString)) {
285bool parseLocation(
const QJsonObject &obj,
const QGeoShape &bounds, QGeoLocation *loc)
287 QJsonObject displayPosition = obj.value(
"DisplayPosition").toObject();
288 QGeoCoordinate coordinate = QGeoCoordinate(displayPosition.value(
"Latitude").toDouble(), displayPosition.value(
"Longitude").toDouble());
289 if (bounds.isValid() && !bounds.contains(coordinate)) {
295 QJsonObject addr = obj.value(
"Address").toObject();
296 address.setCountryCode(addr.value(
"Country").toString());
297 address.setState(addr.value(
"State").toString());
298 address.setCounty(addr.value(
"County").toString());
299 address.setCity(addr.value(
"City").toString());
300 address.setDistrict(addr.value(
"District").toString());
301 QString houseNumber = addr.value(
"HouseNumber").toString();
302 QString street = addr.value(
"Street").toString();
303 address.setStreet(houseNumber.isEmpty() ? street : QString(
"%1 %2").arg(houseNumber, street));
304 address.setPostalCode(addr.value(
"PostalCode").toString());
305 QString label = addr.value(
"Label").toString().trimmed();
306 if (!label.isEmpty()) {
307 address.setText(label);
309 const QJsonArray additionalData = addr.value(
"AdditionalData").toArray();
310 for (
const QJsonValueConstRef adv : additionalData) {
311 if (adv.isObject()) {
312 const QJsonObject &ado(adv.toObject());
313 if (ado.value(
"key").toString() == QLatin1String(
"CountryName")) {
314 address.setCountry(ado.value(
"value").toString());
319 QGeoRectangle boundingBox;
320 QJsonObject mapView = obj.value(
"MapView").toObject();
321 QJsonObject bottomRight = mapView.value(
"BottomRight").toObject();
322 QJsonObject topLeft = mapView.value(
"TopLeft").toObject();
323 boundingBox.setBottomRight(QGeoCoordinate(bottomRight.value(
"Latitude").toDouble(), bottomRight.value(
"Longitude").toDouble()));
324 boundingBox.setTopLeft(QGeoCoordinate(topLeft.value(
"Latitude").toDouble(), topLeft.value(
"Longitude").toDouble()));
326 loc->setAddress(address);
327 loc->setCoordinate(coordinate);
328 loc->setBoundingShape(boundingBox);