Skip to content

Align JSON encoding with OPC UA 1.05 Compact/Verbose rules#1758

Merged
kevinherron merged 1 commit into
mainfrom
json-encoding-fixes
May 29, 2026
Merged

Align JSON encoding with OPC UA 1.05 Compact/Verbose rules#1758
kevinherron merged 1 commit into
mainfrom
json-encoding-fixes

Conversation

@kevinherron

Copy link
Copy Markdown
Contributor

Update the existing Compact/Verbose JSON encoding to match the finalized OPC 10000-6 §5.4 rules, correcting field names and several field-omission behaviors that diverged from the spec.

  • ExtensionObject and Variant use the 1.05 field names (UaTypeId, UaEncoding, UaBody, UaType, Value); the decoder still accepts the legacy names for backward compatibility.
  • StatusCode is always a JSON object: Code omitted when Good, Symbol only in Verbose and only when the literal is known.
  • DiagnosticInfo index fields default to -1 (not 0) on both sides, and InnerStatusCode is omitted when Good per §5.4.2.13.
  • Array elements are encoded in builtin context so default values (0, false, "") are preserved instead of being dropped.
  • String and ByteString omit only NULL in Compact; empty values are present and round-trip as "".
  • A null LocalizedText encodes as JSON null in Verbose, and Guid omits only the all-zero default value.

Scalar encoders are now null-safe, and ExtensionObject decoding no longer depends on JSON field order.

Update the existing Compact/Verbose JSON encoding to match the
finalized OPC 10000-6 §5.4 rules, correcting field names and several
field-omission behaviors that diverged from the spec.

- ExtensionObject and Variant use the 1.05 field names (UaTypeId,
  UaEncoding, UaBody, UaType, Value); the decoder still accepts the
  legacy names for backward compatibility.
- StatusCode is always a JSON object: Code omitted when Good, Symbol
  only in Verbose and only when the literal is known.
- DiagnosticInfo index fields default to -1 (not 0) on both sides, and
  InnerStatusCode is omitted when Good per §5.4.2.13.
- Array elements are encoded in builtin context so default values
  (0, false, "") are preserved instead of being dropped.
- String and ByteString omit only NULL in Compact; empty values are
  present and round-trip as "".
- A null LocalizedText encodes as JSON null in Verbose, and Guid omits
  only the all-zero default value.

Scalar encoders are now null-safe, and ExtensionObject decoding no
longer depends on JSON field order.
@kevinherron kevinherron added this to the 1.1.4 milestone May 29, 2026
@kevinherron kevinherron merged commit 4aaa909 into main May 29, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant