Reversible JSON encoding
In OPC UA, reversible JSON encoding is the JSON form that keeps full type information, so a decoder can reconstruct the original Variant, NodeId and structure exactly. Values appear as objects carrying an explicit built-in type id alongside the body, which makes payloads larger but round-trippable and safe for machine-to-machine use.
What reversible means in practice
A Variant is written as an object with a Type member holding the built-in type id and a Body member holding the value, so a Double 42.5 is distinguishable from an Int32 42 and from the string 42.5. NodeIds keep their identifier type and namespace, LocalizedText keeps its locale, and structures keep their type identifier. Because nothing is inferred, a decoder can rebuild the original data without consulting the address space.
The omitted-Good rule
One economy applies even in the reversible form: a StatusCode of Good is numerically zero and is omitted, per the Part 6 encoding rules. An absent StatusCode member therefore means Good, not missing. Consumers that map absence to null quality will mislabel every healthy value, and consumers that require the field to be present will reject well-formed messages. This is the single most common JSON integration bug.
Reversible, compact and verbose
The naming has moved on. Alongside reversible and non-reversible, the 1.05 generation of the specification defines Compact and Verbose JSON variants, and the tooling reflects that: OPC Publisher exposes reversible, non-reversible, compact and verbose as four distinct encoding options. If you are specifying an interface, name the exact encoding option of the exact product version rather than saying only JSON, and pin it in the interface document.
When to choose it
Choose reversible whenever another OPC UA implementation, a PubSub subscriber or a schema-validating consumer is on the other end, and whenever data will be re-published into another OPC UA server. Choose non-reversible only for a human-facing dashboard or a schemaless time-series sink that is genuinely happy with bare numbers. Reversible payloads are noticeably larger, which is why UADP exists for the deterministic and bandwidth-sensitive cases.
Example
The same DataValue in reversible form - the Type member is what makes it round-trippable
{
"Value": { "Type": 11, "Body": 42.5 },
"SourceTimestamp": "2026-09-07T08:14:22.1230000Z"
}
// Type 11 = Double. A StatusCode of Good (0) is omitted entirely.
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.