如何在REST API客户端中有效地将嵌套JSONMap到自定义Lua数据结构?

im9ewurl  于 2023-10-21  发布在  其他
关注(0)|答案(1)|浏览(106)

我正在使用Lua开发一个REST API客户端,它使用来自第三方服务的数据。该服务返回深度嵌套的JSON对象,我需要将这些对象Map到更简化的Lua表,以便于操作和数据分析。我已经探索过使用cjson这样的库进行基本的格式化,但是我很难有效地将嵌套的JSONMap到我的自定义数据结构。
下面是一个由API返回的JSON对象的简化示例:

{
  "data": {
    "id": 1,
    "attributes": {
      "name": "John",
      "details": {
        "age": 30,
        "address": {
          "street": "123 Main St",
          "city": "Anytown"
        }
      }
    }
  }
}

下面是我想在Lua中Map的内容:

Person = {
  id = 1,
  name = "John",
  age = 30,
  street_address = "123 Main St",
  city = "Anytown"
}

这种Map是否有最佳实践?是否有任何Lua库可以帮助实现这一点,或者我应该编写自定义Map函数?我关心代码的可维护性和性能。
提前感谢您的任何见解或建议!

xpcnnkqh

xpcnnkqh1#

“遍历JSON”功能在这里很有用。

local json = require"json"
local s = [[
{
   "data": {
      "id": 1,
      "attributes": {
         "name": "John",
         "details": {
            "age": 30,
            "address": {
               "street": "123 Main St",
               "city": "Anytown"
            }
         }
      }
   }
}
]]
local Person = {}

json.traverse(s,
   function (path, json_type, value, pos, pos_last)
      local path_str = table.concat(path, "/")
      print("DEBUG:", path_str, json_type, value, pos, pos_last)
      if json_type == "number" or json_type == "string" then
         Person[path[#path]] = value
      end
   end
)

print"RESULT"
for k,v in pairs(Person) do
   print(k, v)
end

输出量:

DEBUG:                                          object  nil          1    nil
DEBUG:  data                                    object  nil          14   nil
DEBUG:  data/id                                 number  1            28   28
DEBUG:  data/attributes                         object  nil          51   nil
DEBUG:  data/attributes/name                    string  John         70   75
DEBUG:  data/attributes/details                 object  nil          98   nil
DEBUG:  data/attributes/details/age             number  30           119  120
DEBUG:  data/attributes/details/address         object  nil          146  nil
DEBUG:  data/attributes/details/address/street  string  123 Main St  173  185
DEBUG:  data/attributes/details/address/city    string  Anytown      211  219
RESULT
name    John
street  123 Main St
city    Anytown
age     30
id      1

库为here

相关问题