英文:
Incorrectly converts to a JSON string
问题
我正在编写一个API,该API执行查询到OSMR服务器并检索一些数据,尝试将这些数据转换为JSON并在我的API中返回。一切都基本正常工作,但是在结果字符串中,数值被替换为字符"{}"。我不知道发生了什么,我已经在解决这个问题上花了一个小时。
package main
import (
"encoding/json"
"fmt"
"net/http"
"net/url"
"time"
"log"
"bytes"
"github.com/stretchr/objx"
"github.com/go-martini/martini"
)
func PrettyJson(data interface{}) (string) {
buffer := new(bytes.Buffer)
encoder := json.NewEncoder(buffer)
encoder.SetIndent("", " ")
err := encoder.Encode(data)
if err != nil {
return ""
}
return buffer.String()
}
func main() {
app := martini.Classic()
app.Get("/", func() string {
return "/"
})
app.Get("/routes", func(req *http.Request, res http.ResponseWriter) string {
query, err := url.ParseQuery(req.URL.RawQuery)
if err != nil {
log.Println(err)
}
var client = &http.Client{Timeout: 100 * time.Second}
if v1, v2 := query["src"], query["dst"]; v1 != nil && v2 != nil {
var routes_array []map[string]interface{}
for _, destination := range query["dst"] {
request_url := fmt.Sprintf("http://router.project-osrm.org/route/v1/driving/%s;%s?overview=false", query["src"][0], destination)
response, err := client.Get(request_url)
if err != nil {
log.Fatal(err)
return "{\"message\": \"internal server error\"}"
}
buf := new(bytes.Buffer)
buf.ReadFrom(response.Body)
newStr := buf.String()
document, _ := objx.FromJSON(newStr)
route := map[string]interface{}{
"destination": destination,
"distance": document.Get("routes[0].distance"),
"duration": document.Get("routes[0].duration"),
}
routes_array = append(routes_array, route)
}
response := map[string]interface{} {
"source": query["src"],
"routes": routes_array,
}
fmt.Println("ROUTES_ARRAY")
fmt.Println(routes_array)
fmt.Println()
fmt.Println("RESPONSE")
fmt.Println(response)
fmt.Println()
return PrettyJson(response)
}
return "{\"message\": \"incorrect value of arguments\"}"
})
app.Run()
}
我的API的输出:
{
"routes": [
{
"destination": "13.397634,52.529407",
"distance": {},
"duration": {}
},
{
"destination": "13.428555,52.523219",
"distance": {},
"duration": {}
}
],
"source": [
"13.388860,52.517037"
]
}
routes_array和response变量的输出:
ROUTES_ARRAY
[map[destination:13.397634,52.529407 distance:1884.8 duration:251.4]
map[destination:13.428555,52.523219 distance:3795.2 duration:384.5]]
RESPONSE
map[routes:[map[destination:13.397634,52.529407 distance:1884.8 duration:251.4]
map[destination:13.428555,52.523219 distance:3795.2 duration:384.5]] source:
[13.388860,52.517037]]
英文:
I am writing an API that performs a query to the OSMR server and retrieves some data, tries to convert this data to JSON and return it in my API, everything works almost fine, but instead of numerical values in the resulting string, it substitutes with the characters "{}". I have no idea what's going on, I've been working on this problem for an hour
package main
import (
"encoding/json"
"fmt"
"net/http"
"net/url"
"time"
"log"
"bytes"
"github.com/stretchr/objx"
"github.com/go-martini/martini"
)
func PrettyJson(data interface{}) (string) {
buffer := new(bytes.Buffer)
encoder := json.NewEncoder(buffer)
encoder.SetIndent("", " ")
err := encoder.Encode(data)
if err != nil {
return ""
}
return buffer.String()
}
func main() {
app := martini.Classic()
app.Get("/", func() string {
return "/"
})
app.Get("/routes", func(req *http.Request, res http.ResponseWriter) string {
query, err := url.ParseQuery(req.URL.RawQuery)
if err != nil {
log.Println(err)
}
var client = &http.Client{Timeout: 100 * time.Second}
if v1, v2 := query["src"], query["dst"]; v1 != nil && v2 != nil {
var routes_array []map[string]interface{}
for _, destination := range query["dst"] {
request_url := fmt.Sprintf("http://router.project-osrm.org/route/v1/driving/%s;%s?overview=false", query["src"][0], destination)
response, err := client.Get(request_url)
if err != nil {
log.Fatal(err)
return "{\"message\": \"internal server error\"}"
}
buf := new(bytes.Buffer)
buf.ReadFrom(response.Body)
newStr := buf.String()
document, _ := objx.FromJSON(newStr)
route := map[string]interface{}{
"destination": destination,
"distance": document.Get("routes[0].distance"),
"duration": document.Get("routes[0].duration"),
}
routes_array = append(routes_array, route)
}
response := map[string]interface{} {
"source": query["src"],
"routes": routes_array,
}
fmt.Println("ROUTES_ARRAY")
fmt.Println(routes_array)
fmt.Println()
fmt.Println("RESPONSE")
fmt.Println(response)
fmt.Println()
return PrettyJson(response)
}
return "{\"message\": \"incorrect value of arguments\"}"
})
app.Run()
}
Output from my API
{
"routes": [
{
"destination": "13.397634,52.529407",
"distance": {},
"duration": {}
},
{
"destination": "13.428555,52.523219",
"distance": {},
"duration": {}
}
],
"source": [
"13.388860,52.517037"
]
}
routes_array and response variable output
ROUTES_ARRAY
[map[destination:13.397634,52.529407 distance:1884.8 duration:251.4]
map[destination:13.428555,52.523219 distance:3795.2 duration:384.5]]
RESPONSE
map[routes:[map[destination:13.397634,52.529407 distance:1884.8 duration:251.4]
map[destination:13.428555,52.523219 distance:3795.2 duration:384.5]] source:
[13.388860,52.517037]]
答案1
得分: 1
一个objx.Value被编组为一个空对象,因为该类型没有任何导出字段。
使用Data方法获取底层值。编组底层值。
route := map[string]interface{}{
"destination": destination,
"distance": document.Get("routes[0].distance").Data(),
"duration": document.Get("routes[0].duration").Data(),
}
英文:
An objx.Value is marshaled to an empty object because the type does not have any exported fields.
Use the Data method to get the underlying value. Marshal the underlying value.
route := map[string]interface{}{
"destination": destination,
"distance": document.Get("routes[0].distance").Data(),
"duration": document.Get("routes[0].duration").Data(),
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论