如何使用 Lua 处理 JSON 中的 null 值?

我正在 Asterisk PBX 中使用 Lua。在处理 JSON 字符串时,我遇到了以下问题。

为什么将 JSON 中的 "null" 值转换为 Lua 中的函数类型?

如何处理这种情况? 因为在 JSON 中没有值意味着 null,而在 Lua 中 nil 意味着什么都没有。

local json = require("json")
local inspect = require("inspect")
local myjson_str='{"Sms":{"key":"xxxxxxxxxxxxxxxxxxxxx","to":"{caller}","senderid":null,"type":"Simple","content":"Your request has been accepted in Previous Miss call. We get back to you very soon."}}'

local myjson_table = json.decode(myjson_str)
print(type(myjson_table["Sms"]["senderid"]))
print(myjson_table)
print(inspect(myjson_table))
print(json.encode(myjson_table))

上述代码的输出是

function
table: 0xf5e770
{
  Sms = {
    content = "Your request has been accepted in Previous Miss call. We get back to you very soon.",
    key = "xxxxxxxxxxxxxxxxxxxxx",
    senderid = <function 1>,
    to = "{caller}",
    type = "Simple"
  }
}
{"Sms":{"type":"Simple","key":"xxxxxxxxxxxxxxxxxxxxx","senderid":null,"content":"Your request has been accepted in Previous Miss call. We get back to you very soon.","to":"{caller}"}}
点赞
用户2328287
用户2328287

将下面翻译成中文并且保留原本的 markdown 格式:

具体的库决定如何表示null值。 使用nil的问题在于不可能确定原始的 JSON 是否具有空值键或者根本没有该键。 因此,一些库只返回一些唯一的值。一些库提供了一种传递这个值的方法, 如json.decode(str, NULL_VALUE)。所以答案就是阅读所使用的库的文档/源代码。 很可能会提供像 json.null 这样的值来检查数据是否为 null。 但是函数是一个非常奇怪的选择,因为它们有一些不确定的唯一性规则。 或者尝试使用另一个库。

2017-02-13 08:35:57
用户10009545
用户10009545

首先,@moteus是正确的:

由具体的库决定如何表示 null 值

如果您使用的是 Jeffrey Friedl 的 JSON 库,则解决方案是使用占位符而不是 null,并使用指定的编码选项将表结构序列化为 JSON 字符串:

-- 定义一个占位符
NullPlaceholder = "\0"

-- 在内部表中使用它
tableStructure = {}
tableStructure['someNullValue'] = NullPlaceholder

-- 将占位符传递给编码方法
encode_options = { null = NullPlaceholder }
jsonString = JSON:encode(tableStructure, nil, encode_options)

这将得到

{"someNullValue": null}
2019-08-12 08:25:53