Hi,

QgsJsonExporter does not respect the attributes order. This has already been discussed in this issue: https://github.com/qgis/QGIS/issues/41290

For example:

```
#!/usr/bin/env python3

from qgis.core import (QgsFeature, QgsGeometry, QgsJsonExporter, QgsPointXY,
                       QgsVectorLayer)

layer = QgsVectorLayer("Point?field=B:string&field=A:integer", "foo", "memory")
feature = QgsFeature()
feature.setAttributes(["test", 123])
feature.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(100, 200)))
provider = layer.dataProvider()
provider.addFeatures([feature])

exp = QgsJsonExporter(layer)
print(exp.exportFeatures(layer.getFeatures()))
```

The output:
```
{"features":[{"geometry":{"coordinates":[100.0,200.0],"type":"Point"},"id":1,"properties":{"A":123,"B":"test"},"type":"Feature"}],"type":"FeatureCollection"}
```

The layer has been created with the features in the order ["B", "A"]. However, QgsJsonExporter returns in the order ["A", "B"] As answered in the issue, it is not really a bug because according to the json specs, "The order of properties in GeoJSON isn’t defined"

However, QgsJsonExporter is used in QGIS Server and for WFS and WMS requests. I got some reports from users who don't understand the difference between an xml and a json output of the same request. Indeed, an xml request will respect the attributes order and return ["B", "A"]
A json request will not respect the attributes order and return ["A", "B"]
From a user perspective, this may look like a bug.

In fact, this "issue" comes from our usage of the "nlohmann" library used to generate the json. Indeed, its main object (used by QgsJsonExporter) is `nlohmann::json` which does sort the keys by alphabetical order as explained in the documentation. If we want to respect the order of insertion, they provide an other object: `nlohmann::ordered_json`
For a full explanation, see:
- https://json.nlohmann.me/features/object_order/
- https://github.com/nlohmann/json?tab=readme-ov-file#order-of-object-keys


So, a proper fix would be to remplace `nlohmann::json` by `nlohmann::ordered_json` in all the `QgsJsonExporter` code and its caller. From a performance point of view, I guess it would be similar to a switch from std::map to std::unordered_map

I don't mind creating a Pull Request to change it but I would like to know first if it would be accepted.
Any ideas or opinions?

Thanks,

Jean


--
Jean Felder
Développeur SIG
Oslandia

Attachment: OpenPGP_0x12722DC64D3F429E.asc
Description: OpenPGP public key

Attachment: OpenPGP_signature.asc
Description: OpenPGP digital signature

_______________________________________________
QGIS-Developer mailing list
QGIS-Developer@lists.osgeo.org
List info: https://lists.osgeo.org/mailman/listinfo/qgis-developer
Unsubscribe: https://lists.osgeo.org/mailman/listinfo/qgis-developer

Reply via email to