Non-reversible JSON encoding
In OPC UA, non-reversible JSON encoding is the compact JSON form that drops type information to produce plain, human-readable values. It cannot be round-tripped: once a value is written as a bare JSON number or string, the original built-in type, NodeId identifier type and structure identity are unrecoverable from the payload.
What is lost
A Variant becomes the bare value, so Int32 42, UInt16 42 and Byte 42 all become the JSON number 42, and there is nothing in the message to tell them apart. Enumerations tend to appear as their numeric value or their string name depending on the implementation. NodeIds lose their identifier-type distinction, LocalizedText loses its locale, and structure fields lose their type identity. A downstream consumer must have out-of-band knowledge of the model to interpret anything precisely.
Why anyone uses it
It is small, readable and drops straight into tools that expect ordinary JSON: a Grafana panel, an InfluxDB or TimescaleDB write path, a Node-RED flow, a browser dashboard. For a fixed set of scalar float and boolean tags going to a time-series database, the lost type information genuinely does not matter, and the payload reduction against reversible JSON is real. It is a presentation encoding, not an interchange encoding.
Where it bites
It bites the second the pipeline grows. Re-publishing non-reversible data into another OPC UA server requires you to reintroduce types by hand from a spreadsheet. Integer tags that were UInt64 counters arrive as JSON numbers and lose precision in JavaScript consumers above 2^53. And the Good-is-omitted rule still applies, so quality is both absent and untyped. The compounding effect is that a year of stored history has no authoritative schema at all.
Naming and product options
Do not specify an interface as JSON and stop there. Alongside reversible and non-reversible, the 1.05 generation defines Compact and Verbose variants, and OPC Publisher exposes all four as separate options. State the exact encoding name and the product version in the interface document, and validate a real captured message against it before the integration is signed off.
Example
The same value in both JSON forms - the non-reversible one has no type left in it
// reversible
{ "Value": { "Type": 6, "Body": 42 }, "SourceTimestamp": "2026-09-07T08:14:22Z" }
// non-reversible
{ "Value": 42, "SourceTimestamp": "2026-09-07T08:14:22Z" }
// Was it Int32, UInt16, Byte or an Enumeration? The payload no longer says.
Defined in: Part 6 - Mappings, JSON encoding.
Last verified 7 September 2026 against OPC UA 1.05.07. OPC UA Connect is an educational resource and is not affiliated with the OPC Foundation.