Re: [Json] JSON and int64s - any change in current best practice since I-JSON

Rob Sayre <sayrer@gmail.com> Tue, 16 January 2024 20:05 UTC

Return-Path: <sayrer@gmail.com>
X-Original-To: json@ietfa.amsl.com
Delivered-To: json@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id CACE5C14CE36 for <json@ietfa.amsl.com>; Tue, 16 Jan 2024 12:05:04 -0800 (PST)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -2.104
X-Spam-Level:
X-Spam-Status: No, score=-2.104 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_ZEN_BLOCKED_OPENDNS=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01, URIBL_BLOCKED=0.001, URIBL_DBL_BLOCKED_OPENDNS=0.001, URIBL_ZEN_BLOCKED_OPENDNS=0.001] autolearn=ham autolearn_force=no
Authentication-Results: ietfa.amsl.com (amavisd-new); dkim=pass (2048-bit key) header.d=gmail.com
Received: from mail.ietf.org ([50.223.129.194]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id g3Z8inZ7zlwV for <json@ietfa.amsl.com>; Tue, 16 Jan 2024 12:05:00 -0800 (PST)
Received: from mail-wr1-x42c.google.com (mail-wr1-x42c.google.com [IPv6:2a00:1450:4864:20::42c]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id 82C61C14F6F7 for <json@ietf.org>; Tue, 16 Jan 2024 12:04:33 -0800 (PST)
Received: by mail-wr1-x42c.google.com with SMTP id ffacd0b85a97d-3368d1c7b23so8952945f8f.0 for <json@ietf.org>; Tue, 16 Jan 2024 12:04:33 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1705435472; x=1706040272; darn=ietf.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=Cqbq3DducwwArJxZQDlOb2nN9ggxZZs5DQN6UExu8rw=; b=AxMmNzMsuC/sGS1s/8rvccgrsgV+1+zzARY+nk/GdxS/o/NWaqMreF78nRGjUxKco4 9m1UYqtfdxlGg8+NKXGAWiZzgxw9ZRvh7JXkohTluwOLf3Z9WrUglCvbHTcjFIoR4quw 3gIDnTOhSfgaKUbCZ+OkcytJx/uW3EXhLT9z2PjpPJMwoL2qsAoikOfpni0Wwadk6FVb LUnLVCyyi5k5ALDtit+6mMMXEs6P95y6JThOTF7qH48X/I67sAfSbTerlktpmCYTCqDb UgrsBRctZVrxFsCp+CBckXI5vnMsO8sHUhyuXd9WawE5PV0I7I4ifk6/1oHb5TCu1HMQ BhFg==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1705435472; x=1706040272; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=Cqbq3DducwwArJxZQDlOb2nN9ggxZZs5DQN6UExu8rw=; b=tpcbgxpB9LkQgj1bhIJKwQkVRHoESSXWmLJjx4XufwgErXBV8r5aRM2YLDc2gOVxnD ET+Iy/F4Cdv9B2m8YifqlsbUBNN1kbkdOniPESmdxlIpuiUBsfHBP1UvM3MUfLZ0Xzbf WgUDfgCY/sqHdou5n9SZZAvDGE/c9l1nSU8731x1Sygy2h4FDoxg5Jp7doEDnenkbtCH ulWgYYlhDvkIuUqDyIzOa60wpXjML+yqzfECx68R92rDHTGq2wH6rJz0fwXxQqYgN+yS jqX9x/EP4wG/CJ+B+WhV/8HYGbweh3nJO3NPG8u+TWXWI3whQlb25SPwh2quWvRqfXrX F1Gg==
X-Gm-Message-State: AOJu0Yz1PLLxz/ih2z84ZgAchdtPoHlhPH/ZZ7EBFdo354Vl47J7inZa M1ps28ELuURjqPRN/RIzFOYAg0oWxljyVz+SPIw=
X-Google-Smtp-Source: AGHT+IH3WGOv+tztJSEg/iNmaQP1lOO5ydmgSqxOHJrr3mccnuyzMdJFJXXIc8/lQzHjZoMesMwUmPce1Rnp7AQAMN4=
X-Received: by 2002:a05:600c:3ace:b0:40d:8557:9263 with SMTP id d14-20020a05600c3ace00b0040d85579263mr4430338wms.130.1705435471709; Tue, 16 Jan 2024 12:04:31 -0800 (PST)
MIME-Version: 1.0
References: <87527a42-aaac-4f39-b320-05f18a2808c1@codalogic.com> <C31BF4C8-9E6C-48F8-BF7B-D2C379273B3F@tzi.org> <CAHBU6it4SaLawSiBgK9ySkbxjtHE6CX-P3r=hzcVy4ksoQo-Cg@mail.gmail.com> <CAChr6SxHfLW-A1asAndKJz-AiyJv5QP18bi=_bNdKXw7zYHThw@mail.gmail.com>
In-Reply-To: <CAChr6SxHfLW-A1asAndKJz-AiyJv5QP18bi=_bNdKXw7zYHThw@mail.gmail.com>
From: Rob Sayre <sayrer@gmail.com>
Date: Tue, 16 Jan 2024 12:04:20 -0800
Message-ID: <CAChr6SweYdCWxSABZ7g20Zd-xBFzcK0Ritq53S7WtjSwc-vLmw@mail.gmail.com>
To: Tim Bray <tbray@textuality.com>
Cc: Carsten Bormann <cabo@tzi.org>, "json@ietf.org" <json@ietf.org>, Pete Cordell <petejson@codalogic.com>
Content-Type: multipart/alternative; boundary="0000000000007a8c60060f15a3a0"
Archived-At: <https://mailarchive.ietf.org/arch/msg/json/Dp98Ezi896aJgXTumlmkvTT7cB0>
Subject: Re: [Json] JSON and int64s - any change in current best practice since I-JSON
X-BeenThere: json@ietf.org
X-Mailman-Version: 2.1.39
Precedence: list
List-Id: "JavaScript Object Notation \(JSON\) WG mailing list" <json.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/json>, <mailto:json-request@ietf.org?subject=unsubscribe>
List-Archive: <https://mailarchive.ietf.org/arch/browse/json/>
List-Post: <mailto:json@ietf.org>
List-Help: <mailto:json-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/json>, <mailto:json-request@ietf.org?subject=subscribe>
X-List-Received-Date: Tue, 16 Jan 2024 20:05:04 -0000

To suggest a positive path forward:

https://es.discourse.group/t/cbor-js-and-the-cbor-object/1759

That is the better fix in my opinion, because BigInts are not the only
problem.

JavaScript has precise number types now (Uint8Array etc etc), and CBOR can
represent these well.

Browsers also have another serialization method called "Structured Clone",
which does a lot more than JSON:
https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm

I mention this one to show that CBOR is totally tractable here.

People often try to adjust JSON or write schema systems to deal with these
issues, but CBOR is a better way forward (imo) because it fixes many issues
all at once.

thanks,
Rob


On Tue, Jan 16, 2024 at 9:09 AM Rob Sayre <sayrer@gmail.com> wrote:

> Hi,
>
> I had the same thought as Pete a while back, but found that JS engines
> actually bar you from encoding these as JSON:
>
> > let two_55th = BigInt(2) ** BigInt(55)
> > two_55th
> 36028797018963968n
> > JSON.stringify(two_55th)
> VM189:1 Uncaught TypeError: Do not know how to serialize a BigInt
>     at JSON.stringify (<anonymous>)
>     at <anonymous>:1:6
>
> I can't find the reference for this one, but the reason they gave was that
> /adding/ support broke too much running code, even though it would be easy
> to add, since the second command there sure does stringify that number.
>
> I think the issue was that too many programs rely on JSON.parse returning
> a JavaScript Number type (distinct from BigInt), so you'll run into
> problems like this TypeError:
>
> > let my_plain_number = JSON.parse("42")
> > my_plain_number
> 42
> > my_plain_number + two_55th
> VM429:1 Uncaught TypeError: Cannot mix BigInt and other types, use
> explicit conversions
>     at <anonymous>:1:17
>
> So, I-JSON remains correct.
>
> thanks,
> Rob
>
>
> On Tue, Jan 16, 2024 at 7:11 AM Tim Bray <tbray@textuality.com> wrote:
>
>> Carsten is right. You probably wouldn’t use JSON if you weren’t likely to
>> be interchanging it with other parties over the network, other parties you
>> don’t control.  For quite a while, it has been quite likely that the other
>> parties use JavaScript, and the limits I-JSON places on numbers are a
>> result of this fact. This fact isn’t going away AFAIK.
>>
>> On Jan 16, 2024 at 6:22:31 AM, Carsten Bormann <cabo@tzi.org> wrote:
>>
>>> Hi Pete,
>>>
>>> On 2024-01-16, at 14:46, Pete Cordell <petejson@codalogic.com> wrote:
>>>
>>>
>>> Hi All,
>>>
>>>
>>> In I-JSON it recommends encoding 64-bit values using a string because
>>> many parsers (in particular browsers) always represent numbers using
>>> floating point doubles.
>>>
>>>
>>> (many parsers == JavaScript’s JSON.parse)
>>>
>>> We're over 8 years on from I-JSON and browsers now support things like
>>> BigInt.
>>>
>>>
>>> I’d say the problem wasn’t so much the absence of BigInt, but the fact
>>> that JavaScript’s JSON.parse always parses JSON numbers as a JavaScript
>>> Number, which is exact only inside (-2**53, 2**53).
>>>
>>> Therefore, I'd be interested to hear if there is any community change of
>>> opinion on how 64-bit ints should be handled in JSON.
>>>
>>>
>>> I think we’d first need wide support for a new equivalent to JSON.parse
>>> in JavaScript.
>>>
>>> Grüße, Carsten
>>>
>>> _______________________________________________
>>> json mailing list
>>> json@ietf.org
>>> https://www.ietf.org/mailman/listinfo/json
>>>
>> _______________________________________________
>> json mailing list
>> json@ietf.org
>> https://www.ietf.org/mailman/listinfo/json
>>
>