首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Openresty中的cjson模块解析缺少字段的JSON

使用Openresty中的cjson模块解析缺少字段的JSON
EN

Stack Overflow用户
提问于 2021-04-30 20:45:40
回答 1查看 1.3K关注 0票数 1

我正试图解析通过POST请求发送给NGINX/Openresty location的json有效负载。为此,我将Openresty的content_by_lua_block与其cjson module组合如下:

代码语言:javascript
运行
复制
# other locations above

location /test {                                                                                                               
    content_by_lua_block {                                                                                                 
        ngx.req.read_body()                                                                                            
        local data_string = ngx.req.get_body_data()                                                                    
                                                                                                                        
        local cjson = require "cjson.safe"                                                                             
        local json = cjson.decode(data_string)                                                                         
                                                                                                                        
        local endpoint_name = json['endpoint']['name']                                                             
        local payload = json['payload']                                                                            
        local source_address = json['source_address']                                                              
        local submit_date = json['submit_date']                                                                    
                                                                                                                            
        ngx.say('Parsed')                                                                                     
                                                                                                                            
    }                                                                                                                      
}                                                                                                               

解析包含所有所需字段的示例数据按预期工作。正确的JSON对象可能如下所示:

代码语言:javascript
运行
复制
{
    "payload": "the payload here",
    "submit_date": "2018-08-17 16:31:51",
    },
    "endpoint": {
        "name": "name of the endpoint here"
    },
    "source_address": "source address here",
}

但是,用户可能会向location发布格式不同的JSON对象。假设有一个简单的JSON文档,如

代码语言:javascript
运行
复制
{
    "username": "JohnDoe",
    "password": "password123"
}

不包含所需的字段/键。

根据cjson module docs,如果遇到无效数据,使用cjson (不使用safe模式)将引发错误。为了防止引发任何错误,我决定通过导入safe来使用它的cjson.safe模式。这应该返回无效数据的nil,并提供错误消息,而不是引发错误:

如果遇到任何无效的数据,cjson模块将在JSON转换期间抛出一个错误。..。

cjson.safe模块的行为与cjson模块相同,除非在JSON转换过程中遇到错误。在出错时,cjson_safe.encodecjson_safe.decode函数将返回零,后面跟着错误消息。

但是,在我的示例中,我没有遇到任何不同的错误处理行为,下面的跟踪显示在Openresty的error.log文件中:

2021/04/30 20:33:16错误6176#6176:*176 lua条目线程中止:运行时错误: content_by_lua(samplesite:50):16:尝试索引字段‘终结点’(一个零值)

这反过来会导致内部服务器错误:

代码语言:javascript
运行
复制
<html>                                                                                                                                 
<head><title>500 Internal Server Error</title></head>                                                                                  
<body>                                                                                                                                 
<center><h1>500 Internal Server Error</h1></center>                                                                                    
<hr><center>openresty</center>                                                                                                         
</body>                                                                                                                                
</html> 

我认为解决办法可能是编写一个专门的函数,用于解析JSON数据并使用pcall()调用它以捕获任何错误。然而,这将使safe模式变得无用。我在这里错过了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-01 09:42:16

您的“简单JSON文档”是一个有效的JSON文档。您面临的错误与cjson无关,这是一个标准的Lua错误:

代码语言:javascript
运行
复制
resty -e 'local t = {foo = 1}; print(t["foo"]); print(t["foo"]["bar"])'
1
ERROR: (command line -e):1: attempt to index field 'foo' (a number value)
stack traceback:
    ...

cjson.safe的“安全性”就是解析格式错误的文档:

  • cjson模块引发一个错误:

-e‘print(需要(“cjson”).decode(“1,2,3”))错误:(命令行-e):1:预期逗号或数组结束,但在字符9堆栈回溯处找到T_END:.

  • cjson.safe返回nil和一条错误消息:

-e‘print(需要(“cjson.safe”).decode(“1,2,3"))’nilExpected逗号或数组末端,但在字符9处找到T_END

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67340255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档