【发布时间】:2016-07-20 14:10:18
【问题描述】:
我有两个不同的json-schemas:
schemaA -> http://json-schema.org/calendar定义的日历
{
"$schema": "http://json-schema.org/draft-04/schema#",
"description": "A representation of an event",
"type": "object",
"required": [ "dtstart", "summary" ],
"properties": {
"dtstart": {
"format": "date-time",
"type": "string",
"description": "Event starting time"
},
"dtend": {
"format": "date-time",
"type": "string",
"description": "Event ending time"
},
"summary": { "type": "string" },
"location": { "type": "string" },
"url": { "type": "string", "format": "uri" },
"duration": {
"format": "time",
"type": "string",
"description": "Event duration"
},
"rdate": {
"format": "date-time",
"type": "string",
"description": "Recurrence date"
},
"rrule": {
"type": "string",
"description": "Recurrence rule"
},
"category": { "type": "string" },
"description": { "type": "string" },
"geo": { "$ref": "http: //json-schema.org/geo" }
}
}
schemaB -> 另一个日历模式(也是 json-schema version draft-04)
我的问题很简单。我有一个遵循第一个模式的javascript对象'calendarA',即
validates(calendarA, schemaA); // true
我想描述模式之间的转换,即从模式A 到模式B,所以我可以将日历A 作为输入传递并获得一个适合模式B 的新日历B。放入代码中:
var calendarB = fromSchemaAtoB(calendarA, schemaA, schemaB);
validates(calendarB, schemaB); // true
从您的角度来看,哪个是从 SchemaAtoB 编写的最佳方法/工具?我真的很想使用模式来描述转换,例如:
schemaB.properties.foo = schemaA.properties.dtstart
我看到了很多基本的 json 转换包,但在我看来,在大多数情况下,您将输出指定为不考虑架构的外部模板(因此结果对于 schemaB 可能无效)。
非常感谢您!
JG
PS:如果可能的话,我更喜欢基于 javascript 的解决方案,但我真的愿意接受任何可能性。
编辑1:为了在阅读@jason 的回答后澄清,问题是如何更好地描述模式之间的这种关系以及如何应用它们来获得calendarB。因此,如果您愿意:
var calendarB = transform(calendarA, schemaA, schemaB, relationsAtoB);
validates(calendarB, schemaB); // true
接下来的问题是如何更好地描述“relationsAtoB”以及如何实现“transform”功能。
【问题讨论】:
-
嗨,请告诉我你更喜欢什么,在创建对象之前转换方案数据或将现有对象变异为另一个?
-
var calendarB = fromSchemaAtoB(calendarA, schemaA, schemaB);如果您确实确定要将shemeA转换为schemeB而不是改变ObjectA,则需要一个模板而不是schemeB,该模板将描述schemeA中的属性关系到schemeB中的专用属性。如果您不喜欢创建模板,fromSchemaAtoB()应该在没有模板的情况下进行所有转换(但这是非常不支持的方法,最好更改 CONFIG 而不是方法本身) -
嗨。如果“在创建对象之前转换方案数据”是指第二个对象是一个全新的对象,我会说我更喜欢这个选项。您的第二个选项也非常有趣,特别是对于出于性能原因我想要变异的大型对象。我想理想的框架应该针对两种转换类型,一种是创建全新对象的默认类型,另一种是对输入对象进行变异的第二种类型。但是现在新的对象。谢谢@Appeiron
-
上一个答案是针对您的第一条评论。对于第二条评论,为了澄清,模式不应该发生变化。它们在转换之前和之后应该是相同的。
-
为了便于转换,最好有模板,您将使用传入的数据进行装饰,并依赖于您传递的关于您在两个方案之间的关系的配置:jsfiddle.net/unLjLtey/2 这取决于您如何处理其他方案没有在关系中定义的属性,应该让转换器复制它们或不触碰就离开。
标签: javascript templates jsonschema json-ld