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

Rob Sayre <sayrer@gmail.com> Tue, 16 January 2024 17:10 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 68EB5C14F710 for <json@ietfa.amsl.com>; Tue, 16 Jan 2024 09:10:41 -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 5Mrk0KWZi4ZS for <json@ietfa.amsl.com>; Tue, 16 Jan 2024 09:10:36 -0800 (PST)
Received: from mail-lf1-x136.google.com (mail-lf1-x136.google.com [IPv6:2a00:1450:4864:20::136]) (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 C2970C14F5F6 for <json@ietf.org>; Tue, 16 Jan 2024 09:09:21 -0800 (PST)
Received: by mail-lf1-x136.google.com with SMTP id 2adb3069b0e04-50e7b273352so11158201e87.1 for <json@ietf.org>; Tue, 16 Jan 2024 09:09:21 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1705424960; x=1706029760; 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=NHS33vkAEnN/nw21145mKcvcxDIrwOsTfKkDl4fMkxI=; b=EKENnUg1Z0kFsH/Vo0zmtXYocvTJaESxIqVZQuOvi7puY0mRxjaDcNEMHUBZ6ClsIE mo7Bnb3O33XqZclVsrvo0GYCQ5jbeg2oWoDBvX43n2kIhlkoJy2Z5B8aHZrIg2uNCFuy f/ZINKpH0OY86070RpqfQQpaZHSdi/8YgWeTGu2aD65RZ7G9rHX9zqD9rs2D/oMQFKpl UMlCUZ2OSw9gGej02Vb9lWjGFtpHpD8/xEV5m7p4PB+Q0VdlWgUkpbSgt5tEQEzuX6Sh FXVM4AAKcF8zAPh+i8AhgLmyNJ835/a5P1qIcBm6eLcy/1kJrTFBEZpyS2OU3H9u+8/f 7eQw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1705424960; x=1706029760; 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=NHS33vkAEnN/nw21145mKcvcxDIrwOsTfKkDl4fMkxI=; b=Yfrbn0zTyp6me8341OMkExctJohhxoTiuEgrUCzebhoem0UHp1s+s5SEy/Ue2L8NuI /tm+qKN9Wtytrbot32NNs5qwylBBd1N3qUXQZ+mN9RA9yTLhGII1HX90+wzyOyrHuieJ 4FRwkrtYjSTBM7GPXdib6+Vb6qigRHGKkz8tr9PWeBC6LJrXwWpooLS22zwVW22aAKnz dlbbNp/8t9QrMlL9rAClwVyF4hx1k6ZkYksAz3bBKgc2PHtv2lgnkbhQSfBm8bqdDDZp 2wIgy0t61mzh0A5mzaeURzx4AU4gF5tV0IgoCPMaF2cjPvEdIN64kaeCLogxo6q3p7sQ Gguw==
X-Gm-Message-State: AOJu0Yyk0J4W+cGG4eJ2lRKtSY7ZNrub4Eb+BQHE8Ce5pn8nV7P3iuLU sdhD26xQ10RVZBIU18X9H9iBwmtkTBzZo6pJfxLGl2Ay2M0=
X-Google-Smtp-Source: AGHT+IEKfENksmlE9eK9AMJKubWJqgezFwknW22Xk5kTz2lTormKoFrBOOhbhUzq6BOwIw+rUHC1t7z4PM2kzoKesTY=
X-Received: by 2002:a05:6512:1323:b0:50e:b3ed:f4fb with SMTP id x35-20020a056512132300b0050eb3edf4fbmr4525302lfu.15.1705424959303; Tue, 16 Jan 2024 09:09:19 -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>
In-Reply-To: <CAHBU6it4SaLawSiBgK9ySkbxjtHE6CX-P3r=hzcVy4ksoQo-Cg@mail.gmail.com>
From: Rob Sayre <sayrer@gmail.com>
Date: Tue, 16 Jan 2024 09:09:07 -0800
Message-ID: <CAChr6SxHfLW-A1asAndKJz-AiyJv5QP18bi=_bNdKXw7zYHThw@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="000000000000e3f499060f133097"
Archived-At: <https://mailarchive.ietf.org/arch/msg/json/Z3rafPJZ0QD3q3CRrgs6-pkEPc0>
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 17:10:41 -0000

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
>