gpt4 book ai didi

json - 从API的json响应中检索数据

转载 作者:行者123 更新时间:2023-12-01 22:37:23 24 4
gpt4 key购买 nike

我试图通过将其存储在某些结构(机场+坐标)中来从json响应中获取数据,但是我不知道该如何处理,因为我对 map 和界面的了解还不够。该代码未显示任何错误,但MapofAirports完全为空,这里是代码:

package main

import (
//"api/client"
//"api/client/clienterrors"
//"api/client/openstreetmap"
"encoding/json"
"fmt"
"io/ioutil"
"log"
"math"
"net/http"
"os"
"strconv"
"strings"
)

type Coordinates struct {
Longitude string `json:"lon"`
Latitude string `json:"lat"`
}

type Airport struct {
Co Coordinates `json:"location"`
IATACode string `json:"id"`
Distance float64 `json:"distance"` // distance to coordinates in kilometer
}

func GetCoordinatesFromURL(url string) (float64, float64) {

parts := strings.Split(url, "=")

lat0 := strings.Split(parts[2], "&")
lon0 := strings.Split(parts[3], "&")

lat1, _ := strconv.ParseFloat(lat0[0], 64)
lon1, _ := strconv.ParseFloat(lon0[0], 64)

return lat1, lon1
}

func CalcDistance(lat1 float64, long1 float64, lat2 float64, long2 float64) float64 {

var latitude1 = lat1 * math.Pi / 180
var latitude2 = lat2 * math.Pi / 180
var longitude1 = long1 * math.Pi / 180
var longitude2 = long2 * math.Pi / 180

var R = 6371.0
var d = R * math.Acos(math.Cos(latitude1)*math.Cos(latitude2)*math.Cos(longitude2-longitude1)+math.Sin(latitude1)*math.Sin(latitude2))

return d
}

func main() {
var Locations []Airport
Locations = make([]Airport, 0)

var url = fmt.Sprintf("https://api.skypicker.com/locations?type=radius&lat=40.730610&lon=-73.935242&radius=250&location_types=airport&limit=3&sort=id&active_only=true")

UrlLat, UrlLon := GetCoordinatesFromURL(url)

resp, err := http.Get(url)
if err != nil {
panic(err.Error())
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)

var airportsJsonResponse interface{}

err = json.Unmarshal(body, &airportsJsonResponse)

MapofAirports, ok := airportsJsonResponse.([]interface{})

if ok {
lenAiroMap := len(MapofAirports)

locationsMaps := make(map[int]map[string]interface{})

for i := 0; i < lenAiroMap; i++ {
locationsMaps[i] = MapofAirports[i].(map[string]interface{})
}
var coords Coordinates
for i := 0; i < lenAiroMap; i++ {
if longitude, ok0 := locationsMaps[i]["lon"].(string); ok0 {
if latitude, ok1 := locationsMaps[i]["lat"].(string); ok1 {
coords = Coordinates{longitude, latitude}
}
}
code := locationsMaps[i]["id"].(string)

latFromCoordinates, _ := strconv.ParseFloat(Locations[i].Co.Latitude, 64)
lonFromCoordinates, _ := strconv.ParseFloat(Locations[i].Co.Longitude, 64)

dist := CalcDistance(latFromCoordinates, lonFromCoordinates, UrlLat, UrlLon)
Locations = append(Locations, Airport{
Co: coords,
IATACode: code,
Distance: dist,
})
}
}
LocationsJson, err := json.Marshal(Locations)
if err != nil {
log.Fatal("Cannot encode to JSON ", err)
}
fmt.Fprintf(os.Stdout, "%s", LocationsJson)
}

screenshot of json response

在屏幕快照中,这是我们拥有的json响应,我正在这样处理:
{ locations[],meta,last_refresh,results_retrieved } ==> location : { id , location + distance(calculated with a function) }

最佳答案

将此行MapofAirports, ok := airportsJsonResponse.([]interface{})更改为此

MapofAirports, ok := airportsJsonResponse.(map[string]interface{})

如果在此行上放置一个断点,您会看到 airportsJsonResponse的类型是 map[string]interface{}
而且您将不得不将此行更改为键值迭代
for i := 0; i < lenAiroMap; i++ {
locationsMaps[i] = MapofAirports[i].(map[string]interface{})
}

如下所示:
        lenAiroMap := len(MapofAirports)
locationsMaps := make([]map[string]interface{},lenAiroMap)
for i, value := range MapofAirports["locations"].([]interface{}) {
converted := value.(map[string]interface{})
locationsMaps[i] = converted
}

关于json - 从API的json响应中检索数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58890148/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com