Data format interoperability 2026-11-05
Data format interoperability means that independent producers and consumers can exchange data with an agreed interpretation. Sharing a syntax is one part of that agreement; character encoding, supported values and handling of ambiguous inputs also matter. Serialization and deserialization must preserve the distinctions the application needs.[ref]
The JavaScript Object Notation (JSON) Data Interchange Format. RFC8259, §1.3 interoperability motivation; §§4,6 and8.1
Consider the original JSON input
{"mode":"fast","mode":"safe"}. RFC8259 says object member names should be unique and warns that duplicate-name handling differs. In Python, the default json.loads result is {'mode': 'safe'}. The same decoder with object_pairs_hook=list instead returns [('mode', 'fast'), ('mode', 'safe')], preserving both pairs.[ref]The JavaScript Object Notation (JSON) Data Interchange Format. §4: object names and duplicate-name interoperability
[ref]The text has not changed, yet one consumer retains one value and another retains both occurrences. Re-encoding the default dictionary cannot recover the discarded occurrence. A consumer can instead use a hook that rejects a repeated name, making the ambiguity explicit before the application acts on it.
An exchange contract can therefore require unique names and a shared duplicate-rejection policy, as well as a character encoding such as UTF-8. That is a stronger agreement than merely saying that both programs support JSON. Data validation then checks application-level requirements on the agreed decoded representation.
JSON 2026-11-05
JSON, short for JavaScript Object Notation, is a textual data interchange format used for serialization. Its values are objects, arrays, strings, numbers, Boolean values and
null. Object member names are strings; array elements are ordered. A complete JSON text may represent a single value, including a number or string.[ref]The format's syntax and an implementation's numerical precision are separate. For an original example, consider
{"n":9007199254740993}. A JavaScript call to JSON.parse produces a Number whose decimal value is 9007199254740992; the requested integer has rounded to in the double-precision floating-point format. The same input decoded by Python's default json.loads retains the integer 9007199254740993 exactly.Encoding the digits as
{"n":"9007199254740993"} preserves them as a string in both examples, but changes the represented type. Any later numerical interpretation needs an agreed rule. RFC8259 identifies the integer interval for exact agreement with commonly used numerical implementations; it does not restrict valid JSON numerals to that interval.[ref]The JavaScript Object Notation (JSON) Data Interchange Format. §6: number magnitude, precision and interoperability
Serialization 2026-11-05
Serialization maps structured program data into a representation that can be stored or transmitted, often a sequence of bytes. Deserialization reconstructs data according to that format. A useful format must specify which values and distinctions it preserves; writing an object's display text is not automatically a reversible encoding. JSON is one textual interchange format, with ordered arrays and objects whose member names are strings.[ref]
In Python, let
value = {"coords": [2, 5], "ready": True}. Calling json.dumps(value, sort_keys=True, separators=(",", ":"), allow_nan=False) produces {"coords":[2,5],"ready":true}. Encoding this string with UTF-8 gives 29 bytes; json.loads reconstructs a value equal to value. Here serialization connects a nested runtime value, text and an explicit character encoding.[ref]Python 3.14 documentation. json module, Basic Usage; JSONEncoder and JSONDecoder conversion tables
The preservation claim is deliberately specific. If
coords originally contains the tuple (2, 5), the default JSON round trip produces a list instead. Equality of the chosen first example therefore proves neither preservation of every runtime type nor preservation of object identity. Format design requires deciding which such distinctions matter. T. Bray 2026-11-05
T. Bray is credited as editor of RFC 8259, the 2017 specification of JSON as a format for serialization of structured data. The document makes both the grammar and data format interoperability requirements explicit: a shared notation is most useful when independent implementations agree on what it means.[ref]
The JavaScript Object Notation (JSON) Data Interchange Format. Editor byline; Sections1–2: purpose, data values and grammar
One concrete example is duplicate object names. The invented text
{"x":1,"x":2} fits the object grammar, but the specification recommends unique names because receiving implementations can handle duplicates differently. Some keep the last pair, some reject the input and some expose all pairs. A parser accepting text and two applications agreeing on its interpretation are different conditions.[ref]The JavaScript Object Notation (JSON) Data Interchange Format. Section4: object grammar, unique-name recommendation and differing receiver behavior
The specification also requires UTF-8 for exchanged JSON outside a closed ecosystem. Character encoding, syntax and agreement on values thus contribute separately to reliable interchange.[ref]
The JavaScript Object Notation (JSON) Data Interchange Format. Section8.1: network interchange encoding
This work illustrates a contribution through precise specification: identifying where superficially similar implementations can disagree and stating requirements that make exchange predictable. The initial-only header retains the document's editor byline.
Portrait page: www.tbray.org/ongoing/misc/Tim