日记
- Jsonix(为XML的JSON接口)是一个JavaScript库,允许您在XML和JSON结构之间转换.
- 通过 Jsonix 您可以将 XML 解析为 JSON( 这个进程叫做 解除挂载)或以 XML 形式将 JSON 序列化(这叫做 排列) (中文(简体) ).
- 这些转换是基于可手动写入或由XML Schema生成的可声明的XML/JSON映射.
Jsonix 的优点 :
- 结构严密
- 类型安全
- 双向
- (可选) XML Schema 驱动
另见其他 Jsonix 特性。 。 。 .
示例
这里有个例子 定购单计划a (试试看) 在 JSFiddle 网上) (中文(简体) ).
生成绘图
绘图由单独的 jsonix-schema- 编译器 (JDK 11+;其罐子不属于此套件):
java -jar jsonix-schema-compiler-full-<VERSION>.jar -d mappings -p PO purchaseorder.xsd [-b bindings.xjb]
生成用于 purchaseorder.xsd 计划 mappings/PO.js; 绘图将放置在变量中 PO。 。 。 .
绑定文件( E).xjb)必须使用雅加达命名空间(xmlns:jaxb="https://jakarta.ee/xml/ns/jaxb", (中文(简体) ), version="3.0"(中文(简体) )
含有当前编译器发布; 旧的自定义 http://java.sun.com/xml/ns/jaxb 命名空间被默默忽略 .
将 XML 分析为 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);
});
你也可以这样 unmarshalString, (中文(简体) ), unmarshalDocument 和(节点下) unmarshalFile。 。 。 .
将JS 序列化为 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: { /* ... */ }
}
});
你也可以这样 marshalString。 。 。 .
类型脚本
用 -generateTypeScript 要在每个映射文件旁边获得描述
jsonix unmarshals 和元帅(PO.d.ts) (中文(简体) ). 加上这个包本身的打字,结果不需要投出:
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: {} }
});
- 解帆归来
Jsonix.TypedNamedValue<T>,也就是说.{ name: QName, value: T }; 生成的文件异名于此 全球因素PurchaseOrderElement作为他们中的所有人RootElement) (中文(简体) ). 生成的映射 常数被声明为JsonixMapping<RootElement>,因此从生成的绘图中构建的上下文推断该联盟是 结果unmarshal*当没有给出类型参数时;一个类型参数会缩小它. - 无标记物体携带
TYPE_NAME(例如:.'PO.USAddress'),生成的界面宣布为字面 可用作歧视者的类型。 它对于输入是可选的; 在集合时不需要设置它 . - 编译器也可以将映射写成ES模块(
<jsonix:output format="esm"/>给PO.mjs),这个 软件包有一个ES模块的切入点,所以import { Jsonix } from '@docx4j/jsonix'在节点无害环境管理和捆绑公司工作. - 节点和节点捆绑商获得一个输入DOM依赖的静态进口(
jsonix.node.mjs,由 软件包exportsnode条件,浏览器的条目为无(jsonix.mjs(三);require()保留UMD。 何处 运行时间无法检测其环境(工人、沙箱),Jsonix.DOM.use({ DOMParser, XMLSerializer, DOMImplementation })提供DOM供使用。 在节点中,XML 1.0文本保留了原始的 U+0085和 U+2028 (xmldom 默认值) 会把它们变成线性信号. context.createUnmarshaller({ onUnexpectedElement, onUnexpectedAttribute })报告阅读量下降(不是 校验符:无内容报告的通配符onUnexpectedElement设置,一个元素 无法持有是 跳过并报告 而不是失败读取,onOverwrittenElement后置元素在 单值财产(最后一项储存,不论有无),context.createMarshaller({ onElement })记录 而错误的输入值名称中的错误 线条。 提供给createUnmarshaller编号 :createMarshaller仅适用于该呼叫,绝不更改共享 上下文.new Jsonix.Context(mappings, { parentPointers: true })给每个未标记的打字对象一个不可假定的PARENT指向其包含的打字对象(根对象无),以及Jsonix.Util.deepCopy(value, parent?)复制子树并重新链接指针, 如 docx4j's-Xparent-pointer编号 :-Xdocx4j-copy型号。 已生成 声明类型PARENT作为可以包含每种类型的类型结合.PARENT不可见for...in, (中文(简体) ),Object.keysJSON和马歇尔.
Jsonix 特性
- 在几乎所有现代浏览器中运行
- 运行在 节点.js
- 使用通用JS模块、ES模块、AMD模块和香草(全局,没有任何模块加载器)运行
- 由jsonix-schema-编译器生成的申报书所编译的脚本打字(见 类型脚本(中文(简体) )
- 双向(XML - > JS以及JS - > XML)
- 执行 排列 (将 JavaScript 对象序列化为 XML)
- 因此支持字符串数据和 DOM 节点
- 执行 解除挂载 (从 XML 分析一个 JavaScript 对象)
- 支持字符串数据、 DOM 节点、 URL 或文件( 有节点
- 由可控制 JavaScript 对象如何转换成 XML 或反之相向的宣告性 XML/JS 映射驱动
- 绘图可以基于 XML Schema 自动生成
- 强结构 - XML/ 对象映射描述 JavaScript 对象的结构
- 强类型 - XML 侧的字符串内容和JavaScript 侧的值之间的转换由声明属性类型控制
- 提供可扩展类型系统
- 支持大多数 XML Schema 简单类型( 插入 QNames)
- 支持列举、列表和联盟简单类型
- 允许添加自己的简单类型
- 支持由多个属性组成的复杂类型
- 扩展后产生的复杂类型支持
- 提供高级财产系统
- XML 内容的字符串处理值、 属性、 元素、 元素、 元素参考属性
- 任意属性, XML 内容的“ 放松” 处理的任何元素属性
文档
线性
从 高来源/日索尼克斯 (阿列克谢·瓦利科夫博士) 麻省理工学院的叉子
(单位:千美元)@mitre/jsonix页:1 从3.2.0起,由 插图 时间
笔迹/jsonix 发表于 @docx4j/jsonix。 。 。 .