Lua JSON валидатор схемы - PullRequest
0 голосов
/ 01 июня 2019

Я искал более 4 дней, но мне не удалось найти много поддержки в коде для компилятора схемы JSON на основе lua. В основном я имел дело с

Но ни один из вышеперечисленных не был простым в использовании.

После решения проблем с luarocks я наконец-то заработал ljsonschema, но синтаксис JSON выглядит иначе, чем обычная структура JSON - для ex: равно вместо точки с запятой, двойных кавычек для имен ключей и т. Д.

ljsonschema поддерживает

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

Мне требуется:

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

При rjson существует проблема с самим местом установки. Хотя установка проходит нормально, он никогда не может найти файл .so во время выполнения кода lua. Плюс, я не могу найти много поддержки для развития.

Пожалуйста, помогите указать правильное направление, если я что-то упустил. У меня есть схема json и пример json, мне просто нужен код lua, чтобы помочь написать программу вокруг него.

Это написать собственный плагин валидации JSON для Kong CE.

ОБНОВЛЕНИЕ: Я хотел бы, чтобы приведенный ниже код работал с 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 })

Но я получаю ошибку: '}' expected (to close '{' at line 5) near ':'

Ответы [ 2 ]

2 голосов
/ 01 июня 2019

похоже, что аргумент для generate_validator и myvalidator - это таблицы lua, а не необработанные строки json. Сначала вы захотите разобрать json:

> jsonschema = require 'jsonschema'
> dkjson = require('dkjson')
> schema = [[
>> { "type" : "object",
>> "properties" : {
>> "foo" : { "type" : "string" },
>> "bar" : { "type" : "number" }}}
>> ]]
> s = dkjson.decode(schema)
> myvalidator = jsonschema.generate_validator(s)
>
> json = '{ "foo": "bar", "bar": 42 }'
> print(myvalidator(json))
false   wrong type: expected object, got string
> print(myvalidator(dkjson.decode(json)))
true
0 голосов
/ 03 июня 2019

Хорошо, я думаю, что rapidjason стал полезным: См. Ссылку Вот пример рабочего кода:

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
...