使用Corona SDK解析Google Distance Matrix API的JSON

我试图从一个JSON字符串中提取数据(如下所示)。当我使用下面的代码decode JSON,然后尝试索引duration text时,返回值为nil。我尝试了各种方法,但什么都不起作用。

这是Google Distance Matrix APIJSON

{
    "destination_addresses" : [ "San Francisco, CA, USA" ],
    "origin_addresses" : [ "Seattle, WA, USA" ],
    "rows" : [
    {
        "elements" : [
        {
            "distance" : {
                "text" : "1,299 km",
                "value" : 1299026
            },
            "duration" : {
                "text" : "12 hours 18 mins",
                "value" : 44303
            },
            "status" : "OK"
        }]
    }],
    "status" : "OK"
}

这是我的代码:

local json = require("json")
local http = require("socket.http")
local myNewData1 = {}
local SaveData1 = function(event)

distanceReturn = ""
distance = ""

local URL1 = "http://maps.googleapis.com/maps/api/distancematrix/json?origins=Seattle&destinations=San+Francisco&mode=driving&&sensor=false"
local response1 = http.request(URL1)
local data2 = json.decode(response1)

if response1 == nil then
    native.showAlert("Data is nill", { "OK" })
    print("Error1")
    distanceReturn = "Error1"

elseif data2 == nill then
    distanceReturn = "Error2"
    native.showAlert("Data is nill", { "OK" })
    print("Error2")
else
    for i = 1, #data2 do
        print("Working")
        print(data2[i].rows)

        for j = 1, #data2[i].rows, 1 do
            print("\t" .. data2[i].rows[j])

            for k = 1, #data2[i].rows[k].elements, 1 do
                print("\t" .. data2[i].rows[j].elements[k])

                for g = 1, #data2[i].rows[k].elements[k].duration, 1 do
                    print("\t" .. data2[i].rows[k].elements[k].duration[g])

                    for f = 1, #data2[i].rows[k].elements[k].duration[g].text, 1 do
                        print("\t" .. data2[i].rows[k].elements[k].duration[g].text)

                        distance = data2[i].rows[k].elements[k].duration[g].text
                        distanceReturn = data2[i].rows[k].elements[k].duration[g].text

                    end
                end
            end
        end
    end
end

timer.performWithDelay(100, SaveData1, 999999)
点赞
用户3580814
用户3580814

你的循环不正确。尝试使用这个更简短的解决方案。

将所有的“for i = 1,#data2 do”循环替换为下面的循环:

print(“正在工作”)

for i,row in ipairs(data2.rows)do
    for j,element in ipairs(row.elements)do
        print(element.duration.text)
    end
end
2014-04-29 09:34:05
用户2883848
用户2883848

这个问题在 Corona Forums 上被 Rob Miracle 解决了(http://forums.coronalabs.com/topic/47319-parsing-json-from-google-distance-matrix-api/?hl=print_r#entry244400)。解决方案很简单:

“JSON 和 Lua 表格几乎是相同的数据结构。在这种情况下,您的表格 data2 有顶级条目:

data2.destination_addresses
data2.origin_addresses
data2.rows
data2.status

现在 data2.rows 是另一个通过数字索引的表格,但此处仅有一个,但仍然是一个数组条目:

data.rows[1]

然后里面还有另一个按数字索引的表格,称为元素。 到目前为止,要访问元素,它们是(再次说明只有一个)

data2.rows[1].elements[1]

然后只需访问其余元素:

data2.rows[1].elements[1].distance.text
data2.rows[1].elements[1].distance.value
data2.rows[1].elements[1].duration.text
data2.rows[1].elements[1].duration.value

有一个很棒的表格打印函数叫做 print_r,可以在社区代码中找到,非常适合将这些表格转储以查看它们的结构。”

2014-04-30 02:47:49