{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "title": "North America address",
    "description": "Postal addresses for Canada, USA and Mexico",
    "type": "object",
    "properties": {
        "address": {
            "type": "object",
            "properties": {
                "name": {
                    "type": "string"
                },
                "number": {
                    "type": "string"
                },
                "street": {
                    "type": "string"
                },
                "street2": {
                    "type": "string"
                },
                "city": {
                    "type": "string"
                },
                "national": {
                    "oneOf": [
                        {
                            "properties": {
                                "country": {
                                    "type": "string",
                                    "enum": [
                                        "CAN"
                                    ]
                                },
                                "province": {
                                    "$ref": "#/definitions/CAN_province"
                                },
                                "postalCode": {
                                    "$ref": "#/definitions/CAN_postalCode"
                                }
                            },
                            "additionalProperties": false,
                            "required": [
                                "country",
                                "province",
                                "postalCode"
                            ]
                        },
                        {
                            "properties": {
                                "country": {
                                    "type": "string",
                                    "enum": [
                                        "USA"
                                    ]
                                },
                                "state": {
                                    "$ref": "#/definitions/USA_state"
                                },
                                "zipCode": {
                                    "$ref": "#/definitions/USA_zipCode"
                                }
                            },
                            "additionalProperties": false,
                            "required": [
                                "country",
                                "state",
                                "zipCode"
                            ]
                        },
                        {
                            "properties": {
                                "country": {
                                    "type": "string",
                                    "enum": [
                                        "MEX"
                                    ]
                                },
                                "state": {
                                    "$ref": "#/definitions/MEX_state"
                                },
                                "postalCode": {
                                    "$ref": "#/definitions/MEX_postalCode"
                                }
                            },
                            "additionalProperties": false,
                            "required": [
                                "country",
                                "state",
                                "postalCode"
                            ]
                        }
                    ]
                }
            },
            "additionalProperties": false,
            "required": [
                "name",
                "number",
                "street",
                "city",
                "national"
            ]
        }
    },
    "definitions": {
        "CAN_province": {
            "type": "string",
            "enum": [
                "AB",
                "BC",
                "MB",
                "NB",
                "NL",
                "NS",
                "NT",
                "NU",
                "ON",
                "PE",
                "QC",
                "SK",
                "YT"
            ]
        },
        "CAN_postalCode": {
            "type": "string",
            "pattern": "^[A-Z][0-9][A-Z]( )?[0-9][A-Z][0-9]$"
        },
        "USA_state": {
            "type": "string",
            "enum": [
                "AL",
                "AK",
                "AR",
                "AS",
                "AZ",
                "CA",
                "CO",
                "CT",
                "DC",
                "DE",
                "FL",
                "FM",
                "GA",
                "GU",
                "HI",
                "IA",
                "ID",
                "IL",
                "IN",
                "KS",
                "KY",
                "LA",
                "MA",
                "MD",
                "ME",
                "MH",
                "MI",
                "MN",
                "MO",
                "MP",
                "MS",
                "MT",
                "NC",
                "ND",
                "NE",
                "NH",
                "NJ",
                "NM",
                "NV",
                "OH",
                "OK",
                "OR",
                "PA",
                "PR",
                "PW",
                "RI",
                "SC",
                "SD",
                "TN",
                "TX",
                "UT",
                "VA",
                "VI",
                "VT",
                "WA",
                "WI",
                "WV",
                "WY",
                "AA",
                "AE",
                "AP"
            ]
        },
        "USA_zipCode": {
            "type": "string",
            "pattern": "^[0-9]{5}(-[0-9]{4})?$"
        },
        "MEX_state": {
            "type": "string",
            "enum": [
                "AGS",
                "BC",
                "BCS",
                "CAM",
                "COAH",
                "COL",
                "CHIH",
                "CHIS",
                "DF",
                "DGO",
                "GTO",
                "GRO",
                "HGO",
                "JAL",
                "MEX",
                "MICH",
                "MOR",
                "NAY",
                "NL",
                "OAX",
                "PUE",
                "QRO",
                "Q ROO",
                "SLP",
                "SIN",
                "SON",
                "TAB",
                "TAMPS",
                "TLAX",
                "VER",
                "YUC",
                "ZAC"
            ]
        },
        "MEX_postalCode": {
            "type": "string",
            "pattern": "^[0-9]{5}$"
        }
    }
}