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-keysSo, 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
OpenPGP_0x12722DC64D3F429E.asc
Description: OpenPGP public key
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