Hi Oleksandr,

As Martin has summarized, the the current behavior is not a bug as the XQuery 3.x specification does not define order on maps. It is up to the implementation to choose an internal order for entries (usually realized via an immutable/persistent hash structure) that maximizes access time. With XQuery 4, as indicated, this is about to change. As you may have seen if you have clicked the Fiddle link, a proof-of-concept implementation is available now that demonstrates the new behavior. It is also included in the latest snapshot of BaseX [1]. We will further pursue it in BaseX, no matter how the spec evolves.

As for JavaScript, the JSON specification (RFC 8259) states that the order of key/value pairs is not guaranteed. In ECMAScript, however, orderedness was introduced with ES6. 

Hope this helps,
Christian



On Mon, Dec 16, 2024 at 4:01 PM Oleksandr Shpak <shadowkin@gmail.com> wrote:
Since ECMAScript v5 if I remember correctly object keys are ordered, because under the hood List object should be used to store keys.


On Mon, Dec 16, 2024 at 4:37 PM Martin Honnen <martin.honnen@gmx.de> wrote:


Am 16.12.2024 um 15:19 schrieb Oleksandr Shpak:
Hi Martin,

I found even more weird situation
parse-json('{"1:aa": 1, "2:bb": 2}')
returns
{"2:bb":2.0e0,"1:aa":1.0e0}

Seems like order is inversed
But,
parse-json('{"aa": 1, "b": 2, "ab": 3}')
returns
{"aa":1.0e0,"ab":3.0e0,"b":2.0e0}

and, finally
parse-json('{"aa": 1, "b": 2, "ab": 3, "1:aa": 1, "2:bb": 2}')
returns
{"aa":1.0e0,"ab":3.0e0,"b":2.0e0,"2:bb":2.0e0,"1:aa":1.0e0}

🤯

It seems like a bug to me ;)


As I said, in XPath 3.1 and XQuery 3.1 maps are unordered collections, you might get any order when parsing a particular JSON into an XDM 3.1 map.

If it is any help, in the BaseX fiddle you probably get/see the order preservation you want/expect.




If we are talking about the JSON standard, not xQuery, devs will expect the function which behaves in the same way as it does in many other languages.

Well, I have been around long enough to remember JavaScript/ECMAScript objects as unordered so some features change in the course of time, I also think, Python, for instance only recently switched to some order preservation in its dictionary type.

I don't know what to suggest for the current BaseX release, unfortunately http://www.woerteler.de/xquery/modules/ordered-map.html is not accessible.



--
s0rr0w