Search code examples
jsonvalidationluaschemakong-plugin

Lua json schema validator


I have been looking for over 4 days now but I havent been able to find much support on code for lua based json schema compiler. Mainly I have been dealing with

But either of the above have not been straight forward to use.

After dealing with issues on the luarocks, I finally got ljsonschema working but the JSON syntax looks different than normal JSON structure - For ex: equals in place of semi colon, no double quotes for key names etc.

ljsonschema supports

{ type = 'object', properties = {
foo = { type = 'string' },
bar = { type = 'number' },},}

I require :

{ "type" : "object",
"properties" : {
"foo" : { "type" : "string" },
"bar" : { "type" : "number" }}}

With rjson there is an issue with the installation location itself. Though the installation goes fine, it is never able to find the .so file while running the lua code. Plus there is not much development support that I could find.

Please help point in the right direction, in case I am missing something. I have the json schema & a sample json, I just need a lua code to help write a program around it.

This is to write a custom JSON Validation Plugin for Kong CE.

UPDATED: I would like the below code to work with ljsonschema:

local jsonschema = require 'jsonschema'

 -- Note: do cache the result of schema compilation as this is a quite
 -- expensive process
 local myvalidator = jsonschema.generate_validator{
   "type" : "object",
   "properties" : {
   "foo" : { "type" : "string" },
   "bar" : { "type" : "number" }
 }
}

print(myvalidator { "foo":"hello", "bar":42 })

But I get the error : '}' expected (to close '{' at line 5) near ':'


Solution

  • Ok, I think rapidjason came to be helpful: Refer the link Here is a sample working code :

    local rapidjson = require('rapidjson')
    
    function readAll(file)
        local f = assert(io.open(file, "rb"))
        local content = f:read("*all")
        f:close()
        return content
    end
    
    local jsonContent = readAll("sampleJson.txt")
    local sampleSchema = readAll("sampleSchema.txt")
    
    local sd = rapidjson.SchemaDocument(sampleSchema)
    local validator = rapidjson.SchemaValidator(sd)
    
    local d = rapidjson.Document(jsonContent)
    
    local ok, message = validator:validate(d)
    if ok then
        print("json OK")
    else
        print(message)
    end