xref: /aosp_15_r20/external/json-schema-validator/doc/cust-msg.md (revision 78c4dd6aa35290980cdcd1623a7e337e8d021c7c)
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