1*78c4dd6aSAndroid Build Coastguard Worker# Custom Message Support 2*78c4dd6aSAndroid Build Coastguard WorkerUsers can add their own custom messages for schema validation using the instructions in this page. 3*78c4dd6aSAndroid Build Coastguard Worker 4*78c4dd6aSAndroid Build Coastguard WorkerThe json schema itself has a place for the customised message. 5*78c4dd6aSAndroid Build Coastguard Worker 6*78c4dd6aSAndroid Build Coastguard Worker## Examples 7*78c4dd6aSAndroid Build Coastguard Worker### Example 1 : 8*78c4dd6aSAndroid Build Coastguard WorkerThe custom message can be provided outside properties for each type, as shown in the schema below. 9*78c4dd6aSAndroid Build Coastguard Worker```json 10*78c4dd6aSAndroid Build Coastguard Worker{ 11*78c4dd6aSAndroid Build Coastguard Worker "type": "object", 12*78c4dd6aSAndroid Build Coastguard Worker "properties": { 13*78c4dd6aSAndroid Build Coastguard Worker "firstName": { 14*78c4dd6aSAndroid Build Coastguard Worker "type": "string", 15*78c4dd6aSAndroid Build Coastguard Worker "description": "The person's first name." 16*78c4dd6aSAndroid Build Coastguard Worker }, 17*78c4dd6aSAndroid Build Coastguard Worker "foo": { 18*78c4dd6aSAndroid Build Coastguard Worker "type": "array", 19*78c4dd6aSAndroid Build Coastguard Worker "maxItems": 3 20*78c4dd6aSAndroid Build Coastguard Worker } 21*78c4dd6aSAndroid Build Coastguard Worker }, 22*78c4dd6aSAndroid Build Coastguard Worker "message": { 23*78c4dd6aSAndroid Build Coastguard Worker "maxItems" : "MaxItem must be 3 only", 24*78c4dd6aSAndroid Build Coastguard Worker "type" : "Invalid type" 25*78c4dd6aSAndroid Build Coastguard Worker } 26*78c4dd6aSAndroid Build Coastguard Worker} 27*78c4dd6aSAndroid Build Coastguard Worker``` 28*78c4dd6aSAndroid Build Coastguard Worker### Example 2 : 29*78c4dd6aSAndroid Build Coastguard WorkerTo keep custom messages distinct for each type, one can even give them in each property. 30*78c4dd6aSAndroid Build Coastguard Worker```json 31*78c4dd6aSAndroid Build Coastguard Worker{ 32*78c4dd6aSAndroid Build Coastguard Worker "type": "object", 33*78c4dd6aSAndroid Build Coastguard Worker "properties": { 34*78c4dd6aSAndroid Build Coastguard Worker "dateTime": { 35*78c4dd6aSAndroid Build Coastguard Worker "type": "string", 36*78c4dd6aSAndroid Build Coastguard Worker "format": "date", 37*78c4dd6aSAndroid Build Coastguard Worker "message": { 38*78c4dd6aSAndroid Build Coastguard Worker "format": "Keep date format yyyy-mm-dd" 39*78c4dd6aSAndroid Build Coastguard Worker } 40*78c4dd6aSAndroid Build Coastguard Worker }, 41*78c4dd6aSAndroid Build Coastguard Worker "uuid": { 42*78c4dd6aSAndroid Build Coastguard Worker "type": "string", 43*78c4dd6aSAndroid Build Coastguard Worker "format": "uuid", 44*78c4dd6aSAndroid Build Coastguard Worker "message": { 45*78c4dd6aSAndroid Build Coastguard Worker "format": "Input should be uuid" 46*78c4dd6aSAndroid Build Coastguard Worker } 47*78c4dd6aSAndroid Build Coastguard Worker } 48*78c4dd6aSAndroid Build Coastguard Worker } 49*78c4dd6aSAndroid Build Coastguard Worker} 50*78c4dd6aSAndroid Build Coastguard Worker``` 51*78c4dd6aSAndroid Build Coastguard Worker### Example 3 : 52*78c4dd6aSAndroid Build Coastguard WorkerFor the keywords `required` and `dependencies`, different messages can be specified for different properties. 53*78c4dd6aSAndroid Build Coastguard Worker 54*78c4dd6aSAndroid Build Coastguard Worker```json 55*78c4dd6aSAndroid Build Coastguard Worker{ 56*78c4dd6aSAndroid Build Coastguard Worker "type": "object", 57*78c4dd6aSAndroid Build Coastguard Worker "properties": { 58*78c4dd6aSAndroid Build Coastguard Worker "foo": { 59*78c4dd6aSAndroid Build Coastguard Worker "type": "number" 60*78c4dd6aSAndroid Build Coastguard Worker }, 61*78c4dd6aSAndroid Build Coastguard Worker "bar": { 62*78c4dd6aSAndroid Build Coastguard Worker "type": "string" 63*78c4dd6aSAndroid Build Coastguard Worker } 64*78c4dd6aSAndroid Build Coastguard Worker }, 65*78c4dd6aSAndroid Build Coastguard Worker "required": ["foo", "bar"], 66*78c4dd6aSAndroid Build Coastguard Worker "message": { 67*78c4dd6aSAndroid Build Coastguard Worker "type" : "should be an object", 68*78c4dd6aSAndroid Build Coastguard Worker "required": { 69*78c4dd6aSAndroid Build Coastguard Worker "foo" : "'foo' is required", 70*78c4dd6aSAndroid Build Coastguard Worker "bar" : "'bar' is required" 71*78c4dd6aSAndroid Build Coastguard Worker } 72*78c4dd6aSAndroid Build Coastguard Worker } 73*78c4dd6aSAndroid Build Coastguard Worker} 74*78c4dd6aSAndroid Build Coastguard Worker``` 75*78c4dd6aSAndroid Build Coastguard Worker### Example 4 : 76*78c4dd6aSAndroid Build Coastguard WorkerThe message can use arguments but note that single quotes need to be escaped as `java.text.MessageFormat` will be used to format the message. 77*78c4dd6aSAndroid Build Coastguard Worker 78*78c4dd6aSAndroid Build Coastguard Worker```json 79*78c4dd6aSAndroid Build Coastguard Worker{ 80*78c4dd6aSAndroid Build Coastguard Worker "type": "object", 81*78c4dd6aSAndroid Build Coastguard Worker "properties": { 82*78c4dd6aSAndroid Build Coastguard Worker "foo": { 83*78c4dd6aSAndroid Build Coastguard Worker "type": "number" 84*78c4dd6aSAndroid Build Coastguard Worker }, 85*78c4dd6aSAndroid Build Coastguard Worker "bar": { 86*78c4dd6aSAndroid Build Coastguard Worker "type": "string" 87*78c4dd6aSAndroid Build Coastguard Worker } 88*78c4dd6aSAndroid Build Coastguard Worker }, 89*78c4dd6aSAndroid Build Coastguard Worker "required": ["foo", "bar"], 90*78c4dd6aSAndroid Build Coastguard Worker "message": { 91*78c4dd6aSAndroid Build Coastguard Worker "type" : "should be an object", 92*78c4dd6aSAndroid Build Coastguard Worker "required": { 93*78c4dd6aSAndroid Build Coastguard Worker "foo" : "{0}: ''foo'' is required", 94*78c4dd6aSAndroid Build Coastguard Worker "bar" : "{0}: ''bar'' is required" 95*78c4dd6aSAndroid Build Coastguard Worker } 96*78c4dd6aSAndroid Build Coastguard Worker } 97*78c4dd6aSAndroid Build Coastguard Worker} 98*78c4dd6aSAndroid Build Coastguard Worker``` 99*78c4dd6aSAndroid Build Coastguard Worker 100*78c4dd6aSAndroid Build Coastguard Worker## Format 101*78c4dd6aSAndroid Build Coastguard Worker```json 102*78c4dd6aSAndroid Build Coastguard Worker"message": { 103*78c4dd6aSAndroid Build Coastguard Worker [validationType] : [customMessage] 104*78c4dd6aSAndroid Build Coastguard Worker } 105*78c4dd6aSAndroid Build Coastguard Worker``` 106*78c4dd6aSAndroid Build Coastguard WorkerUsers can express custom message in the **'message'** field. 107*78c4dd6aSAndroid Build Coastguard WorkerThe **'validation type'** should be the key and the **'custom message'** should be the value. 108*78c4dd6aSAndroid Build Coastguard Worker 109*78c4dd6aSAndroid Build Coastguard WorkerAlso, we can make format the dynamic message with properties returned from [ValidationMessage.java](https://github.com/networknt/json-schema-validator/blob/master/src/main/java/com/networknt/schema/ValidationMessage.java) class such as **arguments, path e.t.c.** 110*78c4dd6aSAndroid Build Coastguard Worker 111*78c4dd6aSAndroid Build Coastguard Worker 112*78c4dd6aSAndroid Build Coastguard Worker 113*78c4dd6aSAndroid Build Coastguard WorkerTake a look at the [PR1](https://github.com/networknt/json-schema-validator/pull/438) and [PR2](https://github.com/networknt/json-schema-validator/pull/632) 114