public override JsonSchema AsJsonSchema() { JsonSchema returnSchema = InitialJsonSchema() .Type(JsonSchemaType.Array); foreach (IJSBPart jsonSchemaBuilderPart in Items) { returnSchema.Items(jsonSchemaBuilderPart.AsJsonSchema()); } if (MinItems.HasValue) { returnSchema.MinItems(MinItems.Value); } if (MaxItems.HasValue) { returnSchema.MaxItems(MaxItems.Value); } if (UniqueItems) { returnSchema.UniqueItems(UniqueItems); } return(returnSchema); }
private void TraverseModell(string parentPath, string parentTypeName, string propertyName, JsonSchema propertyType, bool isRequired, ISet <string> alreadyVisitedTypes, JsonSchema parentType, string parentXpath) { string sanitizedPropertyName = SanitizeName(propertyName); string xPath; string path; int index = 0; do { path = (string.IsNullOrEmpty(parentPath) ? string.Empty : parentPath + ".") + sanitizedPropertyName; xPath = (string.IsNullOrEmpty(parentXpath) ? "/" : parentXpath + "/") + propertyName; if (++index >= 2) { path += index.ToString(); xPath += index.ToString(); } }while (elements.ContainsKey(path)); // exclude elements that does not start with firstPropertyName if (!path.StartsWith(firstPropertyName)) { return; } string minItems = "0"; string maxItems = "1"; TypeKeyword type = propertyType.Get <TypeKeyword>(); if (type != null && type.Value == JsonSchemaType.Array) { List <JsonSchema> items = propertyType.Items(); path += multiplicityString; FollowRef(path, items[0], alreadyVisitedTypes, xPath); // TODO fix multiple item types. It now uses only the first double?minItemsValue = propertyType.MinItems(); double?maxItemsValue = propertyType.MaxItems(); if (minItemsValue.HasValue) { minItems = minItemsValue.ToString(); } maxItems = "*"; if (maxItemsValue.HasValue && maxItemsValue.Value != MagicNumberMaxOccurs) { maxItems = maxItemsValue.ToString(); } } else { FollowRef(path, propertyType, alreadyVisitedTypes, xPath); if (isRequired) { minItems = "1"; } } JsonObject result = new JsonObject(); string inputType = "Field"; string xsdType = propertyType.OtherData.TryGetString("@xsdType"); result.Add("ID", RemoveStarsFromPath(path)); string parentElement = ExtractParent(path); if (parentElement != null) { result.Add("ParentElement", RemoveStarsFromPath(parentElement)); } string xsdValueType = FollowValueType(propertyType); string typeName = ExtractTypeNameFromSchema(propertyType); if (typeName != null) { result.Add("TypeName", SanitizeName(typeName)); } result.Add("Name", sanitizedPropertyName); string fixedValue = null; JsonValue fixedValueJson = propertyType.Const(); if (fixedValueJson != null) { fixedValue = fixedValueJson.String; } if (xsdType != null && xsdType.Equals("XmlAttribute")) { inputType = "Attribute"; } else if ((type == null && xsdValueType == null) || (type != null && (type.Value == JsonSchemaType.Object || type.Value == JsonSchemaType.Array))) { inputType = "Group"; } int maxOccursParsed = maxItems.Equals("*") ? MagicNumberMaxOccurs : int.Parse(maxItems); if ((!inputType.Equals("Group") && string.IsNullOrEmpty(fixedValue)) || (inputType.Equals("Group") && maxOccursParsed > 1)) { string dataBindingNameWithoutFirstPropertyName = $"{parentXpath}/{propertyName}".Replace("/" + firstPropertyName + "/", string.Empty); string dataBindingName = dataBindingNameWithoutFirstPropertyName.Replace("/", "."); result.Add("DataBindingName", dataBindingName); } result.Add("XPath", xPath); result.Add("Restrictions", ExtractRestrictions(xsdValueType, propertyType)); result.Add("Type", inputType); if (!string.IsNullOrEmpty(xsdValueType)) { result.Add("XsdValueType", char.ToUpper(xsdValueType[0]) + xsdValueType.Substring(1)); // Uppercase first character } if (path.EndsWith(".value")) { result.Add("Texts", ExtractTexts(parentElement.Split(".").Last(), parentType)); result.Add("IsTagContent", true); } else { result.Add("Texts", ExtractTexts(propertyName, propertyType)); } result.Add("CustomProperties", new JsonObject()); // ?? result.Add("MaxOccurs", maxOccursParsed); result.Add("MinOccurs", int.Parse(minItems)); result.Add("XName", propertyName); if (fixedValue != null) { result.Add("FixedValue", fixedValue); } string jsonSchemaPointer = "#/properties/" + propertyName; if (parentElement != null) { jsonSchemaPointer = "#/definitions/" + parentTypeName + "/properties/" + propertyName; } result.Add("JsonSchemaPointer", jsonSchemaPointer); string cardinality = "[" + minItems + ".." + maxItems + "]"; string displayString = RemoveLastStar(path) + " : " + cardinality + " " + SanitizeName(typeName); result.Add("DisplayString", displayString); // TODO ..., XmlSchemaReference elements.Add(RemoveStarsFromPath(path), result); }