The vast majority of json out there is not used for implementing someone else's protocol. So most of us don't need that test suite, we're expecting people to conform to our api, not the other way around.
And how does the schema help in that case anyway? Either the request is according to protocol or not. Your api implements that protocol correctly or not.
And if you need to support different versions of the protocol, just provide different end points, api.v2.mydomain.com, api.v3.mydomain.com.
The blob is expected to be something like:
{
"name": "bob",
"age": 42
}
Your code needs to handle the case where the fields aren't there, or they have invalid values (eg the wrong type, or a negative age).You at least need to ignore this input, but if you want this to be a nice API to work with, you probably also want to return error messages that explain what the client did wrong.
You can hand-code this logic (please excuse the pseudo-code):
if (!input.hasKey("name"))
print "The 'name' key is required."
if (typeof input["name"] != "string")
print("The 'name' key is the wrong type. Expected 'string' " +
"but got %s" % typeof input["name"])
if (!input.hasKey("age"))
...
... but I think it's clear that this quickly gets tedious and error-prone. JSON schema is one possible solution: // schema
{
"type": "object",
"properties": {
"name": { "type": "string", "minLength": 1 },
"age": { "type": "integer", "minimum": 0 }
}
}
// handler
validator = new JSONSchemaValidator(schema)
if (validator.validate(instance))
// handle the request
else
print validator.errors.join("\n")Second to the fact that JSON is more compact than XML, I think people like JSON because it's also more readable; I do envy that to some degree but the expressiveness and universal(ness) of XML shouldn't be ignored! On top of that, you aren't only limited to XML - you can serve data from your API in vocabularies specific to the domain.
</sarcasm>
I wholeheartedly agree; introducing schemas is obviously a benefit to JSON. Schemas make things more predictable and plus, nobody's forcing you to use one.