openresty cjson解析json数据

官网:https://github.com/mpx/lua-cjson

文档:https://kyne.com.au/~mark/software/lua-cjson-manual.html

cjson 说明

cjson encode:编码为json数据

语法格式:json_text = cjson.encode(value)
* value可选类型:boolean、lightuserdata (NULL value only)nil、number、string、table
* 以下数据会报错:function、lightuserdata (non-NULL values)thread、userdataLua CJSON uses a heuristic to determine whether to encode a Lua table
as a JSON array or an object. A Lua table with only positive integer
keys of type number will be encoded as a JSON array.
All other tables will be encoded as a JSON object
* table中只有正数,会被转换为json数组
* 含有非正数,会被转换为json object# 示例
value = { true, { foo = "bar" } }
json_text = cjson.encode(value)==> '[true,{"foo":"bar"}]'

cjson.encode_invalid_number:是否编译无效数字

语法格式:value = cjson.encode_invalid_numbers([setting])
* setting可选值:true、false(默认)、null
* 无效数字:无穷数、NaN(not a number)true:编译无效数字,会产生不规则的json
null:将无效数字编译为null
false:不能编译无效数字,直接报错

cjson.encode_keep_buffer:复用编译缓存

语法格式:cjson.encode_keep_buffer([keep])
* keep可选值:true(默认)、falsetrue:复用编译缓存,可提升编译效率
false:每次调用encode后,清除缓存

cjson.encode_max_depth([depth]):编译的最大深度

语法格式:cjson.encode_max_depth([depth])
* 编译的最大深度默认为1000# 示例:循环嵌套
a = {}; a[1] = a

cjson.encode_number_precision:数字编译精度

语法格式:cjson.encode_number_precision([precision])
* precision可选数字范围:1-14,默认14
* 将精度设小,可提升编译性能

cjson.encode_sparse_array:编译稀疏table

语法格式:cjson.encode_sparse_array([convert[, ratio[, safe]]])
* convert:boolean,默认false
* ration:正数,默认为2
* safe:正数,默认为10# table分类:
normal:所有的值都存在
sparse:至少一个值不存在
extremely sparse:不存在的值的数量超过设置的比率# extremely sparse判定条件
* ratio > 0
* maximum_index > safe
* maximum_index > item_count * ratioBy default, attempting to encode an excessively sparse array will
generate an error. If convert is set to true, excessively sparse
arrays will be converted to a JSON object.
* 默认情况下,编译excessively sparse table会报错
* convert设置为true,会转换为json object# 示例
cjson.encode({ [3] = "data" }) ==> '[null,null,"data"]'cjson.encode_sparse_array(true)
cjson.encode({ [1000] = "excessively sparse" })
==> '{"1000":"excessively sparse"}'

使用示例

default.conf

server {listen       80;server_name  localhost;location / {root   /usr/local/openresty/nginx/html;index  index.html index.htm;}location /test {content_by_lua_block {local cjson = require 'cjson';local jsonStr = cjson.encode({a=1, b=2, c=3});ngx.say(jsonStr);}}location /test2 {content_by_lua_block {local cjson = require 'cjson';local jsonStr = cjson.encode({[1]=2, b=2, c=3});local jsonStr2 = cjson.encode({[100]=100, b=2});ngx.say(jsonStr);ngx.say(jsonStr2);}}location /test3 {content_by_lua_block {local cjson = require 'cjson';--cjson.encode_sparse_array(true);local jsonStr = cjson.encode({[1]=2, [2]=2});local jsonStr2 = cjson.encode({[100]=100});ngx.say(jsonStr);ngx.say(jsonStr2);}}location /test4 {content_by_lua_block {local cjson = require 'cjson';cjson.encode_sparse_array(true);local jsonStr = cjson.encode({[1]=2, [2]=2});local jsonStr2 = cjson.encode({[100]=100});ngx.say(jsonStr);ngx.say(jsonStr2);}}error_page   500 502 503 504  /50x.html;location = /50x.html {root   /usr/local/openresty/nginx/html;}
}

创建容器

docker run -it -d -p 5001:80 \
-v /Users/huli/lua/openresty/cjson/default.conf:/etc/nginx/conf.d/default.conf \
--name cjson lihu12344/openresty

使用测试

# 编码table数据
huli@hudeMacBook-Pro cjson % curl localhost:5001/test
{"a":1,"c":3,"b":2}# 非纯稀疏数组
huli@hudeMacBook-Pro cjson % curl localhost:5001/test2
{"1":2,"b":2,"c":3}
{"100":100,"b":2}# 纯稀疏数组,如果没有开启encode_sparse_array,达到extremely sparse会报错
huli@hudeMacBook-Pro cjson % curl localhost:5001/test3
<!DOCTYPE html>
<html>
<head>
<meta content="text/html;charset=utf-8" http-equiv="Content-Type">
<meta content="utf-8" http-equiv="encoding">
<title>Error</title>
<style>body {width: 35em;margin: 0 auto;font-family: Tahoma, Verdana, Arial, sans-serif;}
</style>
</head>
<body>
<h1>An error occurred.</h1>
<p>Sorry, the page you are looking for is currently unavailable.<br/>
Please try again later.</p>
<p>If you are the system administrator of this resource then you should check
the <a href="http://nginx.org/r/error_log">error log</a> for details.</p>
<p>We have articles on troubleshooting issues like <a href="https://blog.openresty.com/en/lua-cpu-flame-graph/?src=wb">high CPU usage</a> and
<a href="https://blog.openresty.com/en/how-or-alloc-mem/">large memory usage</a> on <a href="https://blog.openresty.com/">our official blog site</a>.
<p><em>Faithfully yours, <a href="https://openresty.org/">OpenResty</a>.</em></p>
</body>
</html># cjson.encode_sparse_array(true)
huli@hudeMacBook-Pro cjson % curl localhost:5001/test4
[2,2]
{"100":100}

extremely sparse报错信息

2022/07/13 01:34:20 [error] 8#8: *3 lua entry thread aborted: runtime error: content_by_lua(default.conf:48):9: Cannot serialise table: excessively sparse array
stack traceback:
coroutine 0:[C]: in function 'encode'content_by_lua(default.conf:48):9: in main chunk, client: 172.17.0.1, server: localhost, request: "GET /test3 HTTP/1.1", host: "localhost:5001"
172.17.0.1 - - [13/Jul/2022:01:34:20 +0000] "GET /test3 HTTP/1.1" 500 982 "-" "curl/7.77.0"

openresty cjson解析json数据相关推荐

  1. C/C++程序开发: cJSON的使用(创建与解析JSON数据)

    一.cJSON介绍 cJSON 是一个超轻巧,携带方便,单文件,可以作为 ANSI-C 标准的 JSON 解析器,是一个用C语言编写的简单好用的JSON解析器:它只包含一个C文件和一个头文件,可以非常 ...

  2. 教你不编程快速解析 JSON 数据

    JSON 是一种轻量级的,不受语言约束的数据存储格式,大部分编程语言都可以解析它,并且对编程人员也十分友好.我们在进行通讯/数据交互时,非常经常用到 JSON 格式. 但是,我们在进行数据存储的时候, ...

  3. 利用cJSON解析JSON格式

    目录 一.JSON格式 二.cJSON下载 三.cJSON常用函数接口 四.cJSON解析JSON案例 1.一层键值 2.多层键值(两次为例) 3.json数组解析 五.JSON添加数据 (与链表类似 ...

  4. 深入分析jquery解析json数据

    我们先以解析上例中的comments对象的JSON数据为例,然后再小结jQuery中解析JSON数据的方法. JSON数据如下,是一个嵌套JSON: {"comments":[{& ...

  5. java构造和解析json_Java构造和解析Json数据的两种方法详解一

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...

  6. Gson解析JSON数据中动态未知字段key的方法

    转载自:https://blog.csdn.net/jdsjlzx/article/details/76785239 有时在解析json数据中的字段key是动态可变的时候,由于Gson是使用静态注解的 ...

  7. java json解析 代码_Java构造和解析Json数据的两种方法详解一

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...

  8. Java构造和解析Json数据的两种方法详解一

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...

  9. json解析详解 java_Java解析Json数据的两种方式详解

    JSON数据解析的有点在于他的体积小,在网络上传输的时候可以更省流量,所以使用越来越广泛,下面介绍使用JsonObject和JsonArray的两种方式解析Json数据. 使用以上两种方式解析json ...

最新文章

  1. RESTful之异常处理 Exceptions
  2. 谋定数字农业生态系统 万亿市场对话中国农民丰收节交易会
  3. 五年后存储会是什么样子
  4. 【agc004d】Teleporter
  5. linux telnet localhost 25,测试邮件系统:telnet localhost 25时的问题~
  6. 动态规划 BZOJ2287【POJ Challenge】消失之物
  7. leetcode刷题日记-三个无重叠子数组的最大和
  8. ELK logstash的grok 自定义正则匹配日志
  9. 事故记录-过多进程致使CPU卡死
  10. ERP中Bom的替代料
  11. Vue-全局websocket 实现消息推送
  12. Micropython进阶小实验 如何用单片机制作鞋码匹配仪
  13. .NET iTextSharp PDF添加文字水印
  14. 软件测试基础知识学习
  15. html中切角文本框,css实现切角效果
  16. ai专家人工智能讲师老师叶梓老师《人工智能概念入门》培训人工智能项目咨询-8
  17. 台式电脑F1F2变成音量键怎么办
  18. 纽约州立大学环境与林业学院计算机科学专业,纽约州立大学环境与林业学院研究生专业 如何应对严峻的环境污染问题...
  19. TERA: Screen-to-Camera Image Code with Transparency, Efficiency, Robustness and Adaptability论文阅读
  20. 使用Altium Designer 绘制PCB的详细过程

热门文章

  1. 我用时间称自己的重量,然后数落自己的肤浅与狂妄--2017年终总结
  2. 数组名不代表首元素地址的两种例外情况
  3. Flink之Sink
  4. 山西评计算机高级职称,山西省高级职称评审通知
  5. 入门java第一天(1) java介绍(学习笔记)
  6. linux kernel patch 使用说明
  7. 不买NAS,也能用cpolar搭建私有云盘2 (安装Synology Assistant)
  8. (转)redis常用命令及客户端的使用
  9. JavaScript的异步处理
  10. 华硕win10+Ubuntu18.04双系统安装与卸载