Search code examples
javascriptxmljsonjsonix

JSONIX: Get restrictions and default value for properties


I am using JSONIX for marshalling and unmarshalling XML files. So far it works pretty well. What I am missing is the possibility to get default values and restrictions like minOccours and maxOccours-Values. Is this somehow possible with JSONIX?

These properties:

    <xsd:sequence>
      <xsd:element name="inflowMin" type="framework:flowType" minOccurs="0" maxOccurs="1"/>
      <xsd:element name="inflowMax" type="framework:flowType" minOccurs="0" maxOccurs="1"/>
      <xsd:element name="unitOfFlowControl" type="framework:flowUnit" minOccurs="0" maxOccurs="1"/>
    </xsd:sequence>
    <xsd:attribute name="waterCosts" type="xsd:double" default="0.0"/>
    <xsd:attribute name="controllable" type="xsd:boolean" default="0"/>
    <xsd:attribute name="scalingOfControl" type="xsd:double" default="1.0" />

Get:

    propertyInfos: [{
        type: 'element',
        name: 'inflowMin',
        elementName: 'inflowMin',
        typeInfo: ...
    }, {
        type: 'element',
        name: 'inflowMax',
        elementName: 'inflowMax',
        typeInfo: ...
    }, {
        type: 'element',
        name: 'unitOfFlowControl',
        elementName: 'unitOfFlowControl',
        typeInfo: 'String'
    }, {
        name: 'waterCosts',
        typeInfo: 'Double',
        attributeName: 'waterCosts',
        type: 'attribute'
    }, {
        name: 'controllable',
        typeInfo: 'Boolean',
        attributeName: 'controllable',
        type: 'attribute'
    }, {
        name: 'scalingOfControl',
        typeInfo: 'Double',
        attributeName: 'scalingOfControl',
        type: 'attribute'
    }]
}

Thanks!


Solution

  • The feature you requested is now implemented in Jsonix 2.3.2 and Jsonix Schema Compiler 2.3.7.

    Jsonix Schema Compiler now produces required, minOccurs and maxOccurs in the generated mappings and the JSON schema.

    This is how it looks in the mappings:

      {
        localName: 'Items',
        propertyInfos: [{
            name: 'item',
            minOccurs: 0,
            maxOccurs: 100,
            collection: true,
            elementName: {
              localPart: 'item'
            },
            typeInfo: '.Items.Item'
          }]
      }
    

    And in the JSON Schema:

        "Items":{
            "type":"object",
            "title":"Items",
            "properties":{
                "item":{
                    "title":"item",
                    "allOf":[
                        {
                            "type":"array",
                            "items":{
                                "$ref":"#/definitions/Items.Item"
                            },
                            "maxItems":100,
                            "minItems":0
                        }
                    ],
                    "propertyType":"element",
                    "elementName":{
                        "localPart":"item",
                        "namespaceURI":""
                    }
                }
            },
            "typeType":"classInfo",
            "typeName":{
                "localPart":"Items",
                "namespaceURI":""
            },
            "propertiesOrder":[
                "item"
            ]
        }
    

    You can access this metadata from the Jsonix context as follows:

        var context = new Jsonix.Context([ PO ]);
        var itemsClassInfo = context.getTypeInfoByName("PO.Items");
        var itemPropertyInfo = itemsClassInfo.getPropertyInfoByName("item");
        test.equal(false, itemPropertyInfo.required);
        test.equal(0, itemPropertyInfo.minOccurs);
        test.equal(100, itemPropertyInfo.maxOccurs);
        test.done();