Aller au contenu

libcjson: bibliothèque cJSON basée sur FFI de LuaJIT pour nginx-module-lua

Installation

Si vous n'avez pas configuré d'abonnement au dépôt RPM, inscrivez-vous. Ensuite, vous pouvez procéder avec les étapes suivantes.

CentOS/RHEL 7 ou Amazon Linux 2

yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install lua-resty-libcjson

CentOS/RHEL 8+, Fedora Linux, Amazon Linux 2023

dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install lua5.1-resty-libcjson

Pour utiliser cette bibliothèque Lua avec NGINX, assurez-vous que nginx-module-lua est installé.

Ce document décrit lua-resty-libcjson v1.4 publié le 04 juillet 2016.


lua-resty-libcjson est une bibliothèque cJSON basée sur FFI de LuaJIT (testée également avec OpenResty).

API Lua

mixed json.decode(value)

Décode une valeur ou une structure JSON (tableau ou objet JSON), et retourne soit une table Lua soit une valeur simple (par exemple boolean, string, number, nil ou json.null (lorsqu'il est exécuté dans le contexte d'OpenResty, json.null est identique à ngx.null).

Exemple
local json = require "resty.libcjson"
local obj = json.decode "{}"       -- table (avec obj.__jsontype == "object")
local arr = json.decode "[]"       -- table (avec arr.__jsontype == "array")
local nbr = json.decode "1"        -- 1
local bln = json.decode "true"     -- true
local str = json.decode '"test"'   -- "test"
local str = json.decode '""'       -- ""
local num = json.decode(5)         -- 5
local num = json.decode(math)      -- math
local num = json.decode(json.null) -- json.null
local nul = json.decode "null"     -- json.null
local nul = json.decode ""         -- nil
local nul = json.decode(nil)       -- nil
local nul = json.decode()          -- nil

Les structures JSON imbriquées sont analysées comme des tables Lua imbriquées.

string json.encode(value, formatted)

Encode une valeur ou une table Lua, et retourne la valeur ou la structure JSON équivalente sous forme de chaîne. En option, vous pouvez passer l'argument formatted avec la valeur false pour obtenir une chaîne JSON non formatée en sortie.

Exemple
local json = require "resty.libcjson"
local str = json.encode{}                              -- "[]"
local str = json.encode(setmetatable({}, json.object)) -- "{}"
local str = json.encode(1)                             -- "1"
local str = json.encode(1.1)                           -- "1.100000"
local str = json.encode "test"                         -- '"test"'
local str = json.encode ""                             -- '""'
local str = json.encode(false)                         -- "false"
local str = json.encode(nil)                           -- "null"
local str = json.encode(json.null)                     -- "null"
local str = json.encode()                              -- "null"
local str = json.encode{ a = "b" }                     -- '{ "a": "b" }'
local str = json.encode{ "a", b = 1 }                  -- '{ "1": "a", "b": 1 }'
local str = json.encode{ 1, 1.1, "a", "", false }      -- '[1, 1.100000, "a", "", false]' 

Les tables Lua imbriquées sont encodées comme des structures JSON imbriquées (objets ou tableaux JSON).

À propos de l'encodage et du décodage des tableaux et objets JSON

Voir ce commentaire : https://github.com/bungle/lua-resty-libcjson/issues/1#issuecomment-38567447.

Benchmarks

Environ 190 Mo citylots.json :

## Lua cJSON
Temps de décodage : 5.882825
Temps d'encodage : 4.902301
## lua-resty-libcjson
Temps de décodage : 6.409872
Temps d'encodage : (prend une éternité)

GitHub

Vous pouvez trouver des conseils de configuration supplémentaires et de la documentation pour ce module dans le dépôt GitHub pour nginx-module-libcjson.