@docx4j/jsonix

中文文档
3.13.0发布于 2026/11/07(Apache-2.0 AND BSD-2-Clause)TypeScriptESM + CJS构建来源已验证近 30 天下载 3253

Jsonix (JSON interfaces for XML) is a JavaScript library which allows converting between XML and JSON structures.

原始使用文档
文档目录8 节
  1. Example
  2. Generate mappings
  3. Parse XML into JS
  4. Serialize JS as XML
  5. TypeScript
  6. Jsonix Features
  7. Documentation
  8. Lineage

Jsonix

  • Jsonix (JSON interfaces for XML) is a JavaScript library which allows you to convert between XML and JSON structures.
  • With Jsonix you can parse XML into JSON (this process is called unmarshalling) or serialize JSON in XML form (this is called marshalling).
  • These conversions are based on declarative XML/JSON mappings which can be written manually or generated from an XML Schema.

Jsonix advantages:

  • Strongly structured
  • Type-safe
  • Bidirectional
  • (Optionally) XML Schema-driven

See also the other Jsonix features.

Example

Here's a working example for the purchase order schema (try it online in JSFiddle).

Generate mappings

Mappings are generated by the separate jsonix-schema-compiler (JDK 11+; its jar is not part of this package):

java -jar jsonix-schema-compiler-full-<VERSION>.jar -d mappings -p PO purchaseorder.xsd [-b bindings.xjb]

Generates mappings for the purchaseorder.xsd schema in mappings/PO.js; mappings will be placed in the variable PO. Binding files (.xjb) must use the Jakarta namespace (xmlns:jaxb="https://jakarta.ee/xml/ns/jaxb", version="3.0") with current compiler releases; customisations in the old http://java.sun.com/xml/ns/jaxb namespace are silently ignored.

Parse XML into JS

// Include or require PO.js so that PO variable is available
// For instance, in node.js:
var PO = require('./mappings/PO').PO;

// First we construct a Jsonix context - a factory for unmarshaller (parser)
// and marshaller (serializer)
var context = new Jsonix.Context([PO]);

// Then we create a unmarshaller
var unmarshaller = context.createUnmarshaller();

// Unmarshal an object from the XML retrieved from the URL
unmarshaller.unmarshalURL('po.xml',
    // This callback function will be provided
    // with the result of the unmarshalling
    function (unmarshalled) {
        // Alice Smith
        console.log(unmarshalled.value.shipTo.name);
        // Baby Monitor
        console.log(unmarshalled.value.items.item[1].productName);
    });

You can also unmarshalString, unmarshalDocument and (under node.js) unmarshalFile.

Serialize JS as XML

// Create a marshaller
var marshaller = context.createMarshaller();

// Marshal a JavaScript Object as XML (DOM Document)
var doc = marshaller.marshalDocument({
    name: {
        localPart: "purchaseOrder"
    },
    value: {
        orderDate: { year: 1999, month: 10, day: 20 },
        shipTo: {
            country: "US",
            name: "Alice Smith",
            street: "123 Maple Street",
            city: "Mill Valley",
            state: "CA",
            zip: 90952
        },
        billTo: { /* ... */ },
        comment: 'Hurry, my lawn is going wild!',
        items: { /* ... */ }
    }
});

You can also marshalString.

TypeScript

Run the compiler with -generateTypeScript to get, next to each mapping file, a declaration file describing the objects Jsonix unmarshals and marshals (PO.d.ts). Together with this package's own typings the results need no casts:

import { Jsonix } from '@docx4j/jsonix';
import { PO } from './mappings/PO';
import type { PurchaseOrderElement, USAddress } from './mappings/PO';

const context = new Jsonix.Context([PO]);
const element = context.createUnmarshaller().unmarshalString(xml);   // RootElement, inferred from PO
const po = context.createUnmarshaller().unmarshalString<PurchaseOrderElement>(xml).value;
po.shipTo.name;        // string
po.orderDate?.year;    // number | undefined: dates are Jsonix calendars, not JS Dates

const shipTo: USAddress = { name: 'Alice Smith', street: '123 Maple Street', city: 'Mill Valley', state: 'CA', zip: 90952 };
const text = context.createMarshaller().marshalString<PurchaseOrderElement>({
    name: { namespaceURI: '', localPart: 'purchaseOrder' },
    value: { shipTo, billTo: shipTo, items: {} }
});
  • An unmarshaller returns Jsonix.TypedNamedValue<T>, i.e. { name: QName, value: T }; generated files alias it per global element (PurchaseOrderElement) and as the union of all of them (RootElement). The generated mapping constant is declared as JsonixMapping<RootElement>, so a context built from generated mappings infers that union as the result of unmarshal* when no type argument is given; a type argument narrows it.
  • Unmarshalled objects carry TYPE_NAME (e.g. 'PO.USAddress'), which the generated interfaces declare as a literal type usable as a discriminant. It is optional on input; you need not set it when marshalling.
  • The compiler can also write the mapping as an ES module (<jsonix:output format="esm"/> gives PO.mjs), and this package has an ES-module entry point, so import { Jsonix } from '@docx4j/jsonix' works in Node ESM and bundlers.
  • Node and Node bundlers get an entry with static imports of the DOM dependency (jsonix.node.mjs, selected by the package's exports node condition), browsers an entry with none (jsonix.mjs); require() keeps the UMD. Where the runtime cannot detect its environment (workers, sandboxes), Jsonix.DOM.use({ DOMParser, XMLSerializer, DOMImplementation }) supplies the DOM to use. In Node, XML 1.0 text keeps raw U+0085 and U+2028 (xmldom's default would turn them into line feeds).
  • context.createUnmarshaller({ onUnexpectedElement, onUnexpectedAttribute }) reports what lax reading drops (not a validator: wildcards that keep content report nothing); with onUnexpectedElement set, an element nothing can hold is skipped and reported instead of failing the read, onOverwrittenElement reports a value a later element replaces in a single-valued property (the last is stored, with or without it), context.createMarshaller({ onElement }) records which object each written element came from, and an error from a wrongly typed value names the element, attribute and line. Options given to createUnmarshaller / createMarshaller apply to that call only and never change the shared context.
  • new Jsonix.Context(mappings, { parentPointers: true }) gives every unmarshalled typed object a non-enumerable PARENT pointing at its containing typed object (root objects have none), and Jsonix.Util.deepCopy(value, parent?) copies a subtree and re-links the pointers, like docx4j's -Xparent-pointer / -Xdocx4j-copy model. Generated declarations type PARENT as the union of the types that can contain each type. PARENT is invisible to for...in, Object.keys, JSON and the marshaller.

Jsonix Features

  • Runs in almost any modern browser
  • Runs in Node.js
  • Runs with CommonJS modules, ES modules, AMD modules as well as vanilla (globals, without any module loader)
  • Ships TypeScript typings that compose with the declarations generated by jsonix-schema-compiler (see TypeScript)
  • Bidirectional (XML -> JS as well as JS -> XML)
  • Implements marshalling (serializing the JavaScript object into XML)
    • Supports string data and DOM nodes as result
  • Implements unmarshalling (parsing a JavaScript object from XML)
    • Supports string data, DOM nodes, URLs or files (with Node.js) as source
  • Driven by declarative XML/JS mappings which control how JavaScript object is converted into XML or vice versa
  • Mappings can be automatically generated based on the XML Schema
  • Strongly-structured - XML/object mappings describe structures of JavaScript objects
  • Strongly-typed - Conversion between string content on XML side and values on the JavaScript side is controlled by declared property types
  • Provides extensible type system
    • Supports most XML Schema simple types (inlcuding QNames)
    • Supports enumerations, list and union simple types
    • Allows adding own simple types
    • Supports complex types consisting of several properties
    • Supports deriving complex types by extension
  • Provides advanced property system
    • Value, attribute, element, element reference properties for string processing of XML content
    • Any attribute, any element properties for "lax" processing for XML content

Documentation

Lineage

Forked from highsource/jsonix (Dr. Alexey Valikov) via MITRE's fork (@mitre/jsonix, up to 3.0.11). From 3.2.0 maintained by Plutext at plutext/jsonix and published as @docx4j/jsonix.

版本与发布记录

@docx4j/jsonix 共发布 15 个版本,首次发布于 2026/09/14;过去 12 个月发布了 15 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
3.13.0latest2026/11/076 天前
3.12.02026/11/067 天前
3.11.02026/10/2816 天前
3.10.02026/10/2816 天前
3.9.02026/10/2618 天前
3.8.02026/10/2420 天前

关于 @docx4j/jsonix 的常见问题

@docx4j/jsonix 是什么?

Jsonix (JSON interfaces for XML) is a JavaScript library which allows converting between XML and JSON structures.

如何安装 @docx4j/jsonix?

在项目目录运行 npm install @docx4j/jsonix,或使用 pnpm add / yarn add / bun add。

@docx4j/jsonix 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@docx4j/jsonix 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@docx4j/jsonix 可以商用吗?

@docx4j/jsonix 使用 (Apache-2.0 AND BSD-2-Clause) 许可。声明的许可为 (Apache-2.0 AND BSD-2-Clause),请阅读许可原文确认使用条件。以上为概括,不构成法律意见,请以许可原文为准。

@docx4j/jsonix 的下载量有多少?

根据 npm 官方下载统计,@docx4j/jsonix 在 2026/10/13 – 2026/11/11 这 30 天内被下载 3,253 次,日均约 108 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@docx4j/jsonix 还在维护吗?

最新版本 3.13.0 发布于 2026/11/07(6 天前);至今共发布 15 个版本,其中过去 12 个月发布了 15 个;首次发布于 2026/09/14。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。