Stop Integer Coercion to Scientific Notation in JSON

Trevor DeVore lists at
Fri Sep 13 17:37:20 EDT 2019

On Thu, Sep 12, 2019 at 1:42 PM Sannyasin Brahmanathaswami via use-livecode
<use-livecode at> wrote:

> Been working Panos off list.
> There is a caveat, jsonImport and jsonExport not only "display" but
> "preserve" the scientific notation as a literal string and math will fail.
> Panos says: must use, (and include in a standalone)  mergeJson to
> use:  jsonToArray  and arrayToJSON

While ArrayToJSON does fix the problem you are experiencing, it does
introduce additional problems. Try the following code:

on mouseUp
  put 1 is 1 into tValueA["root"]["boolean_1"]
  put 1 is 0 into tValueA["root"]["boolean_2"]
  put null into tValueA["root"]["null_1"]
  put "100" into tValueA["root"]["text"]
  put 100+0 into tValueA["root"]["number"]
  put ArrayToJSON(tValueA)
end mouseUp

The output is as follows:

  "root": {
    "boolean_2": false,
    "text": 100,
    "null_1": "",
    "boolean_1": true,
    "number": 100


ArrayToJSON won't ever quote numbers, even if the variable in LiveCode has
the number stored as a string (and not an integer or a real). Imagine a
user enters the string "100" into a text field and then your app sends that
value to a JSON API. If you send an integer to a JSON API that is expecting
a string you will most likely get an error.

The output would more appropriately be rendered this way:


  "root": {
    "boolean_2": false,
    "text": "100",
    "null_1": null,
    "boolean_1": true,
    "number": 100


Here is a variation on ArrayToJSON that renders the more appropriate output:


function ArrayToJSON pArray,pForceRootType,pPretty
  local tKey, e

  repeat for each key tKey in pArray
    if pArray[tKey] is an array then
      put "}"&ArrayToJSON(pArray[tKey]) into pArray[tKey]
    else if pArray[tKey] is NULL then
      put "null" into pArray[tKey]
    else if pArray[tKey] is strictly a boolean \
          or pArray[tKey] is strictly an integer \
          or pArray[tKey] is strictly a real then
      put pArray[tKey] into pArray[tKey]
      # treat as a string
      put "}}"&pArray[tKey] into pArray[tKey]
    end if
  end repeat

end ArrayToJSON


In my projects I use this modified version of ArrayToJSON to export JSON
and a wrapper around JsonImport to import JSON. In my experience that gets
me the closest to expected values. Unfortunately JsonImport is rather slow,
but it is more accurate. I don't recall all of the nuances as to why though.

Here is my wrapper around JsonImmport:


function _importJSON pJSON
  # zero width joiner breaks JSON Importer
  replace numtoCodePoint("0x200D") with empty in pJSON
  return JsonImport(pJSON)
end _importJSON


Trevor DeVore

More information about the use-livecode mailing list