我正在编写Golang api和客户端,但是无法从api中的结构片中获取有效的json。我从客户那里得到的结果是这样的。
[{0 Mark 1234 false} {0 John 3456 false}]
我需要这个json看起来像
[{“ id”:0,“ name”:Mark,“ pin”:1234,“ active”:false} {“ id”:0,“ name”:John,“ pin”:3456,“ active “:false}]
我找不到显示如何正确编写代码的示例,尽管有警告,但我无法找到任何示例。当我的客户端成功将JSON解析回结构时,我 也需要它将JSON返回给请求它的IOS客户端。流程为API-> API-> iOS客户端。我不知道如何从iOS客户端的结构生成JSON。
这是我的api代码。
// Employee model
type Employee struct {
EmployeeID int64 `json:"id"`
Name string `json:"name"`
Pin int `json:"pin"`
Active bool `json:"active"`
}
func getEmployees(db *sql.DB, venueID int64) ([]Employee, error) {
var employee Employee
var employees []Employee
query, err := db.Query("SELECT id, name, pin FROM employees WHERE active=1 AND venue_id=? ORDER BY name", venueID)
if err != nil {
return employees, err
}
defer query.Close()
for query.Next() {
err = query.Scan(&employee.EmployeeID, &employee.Name, &employee.Pin)
if err != nil {
return employees, err
}
employees = append(employees, employee)
}
return employees, err
}
func (rs *appResource) listEmployees(w http.ResponseWriter, r *http.Request) {
var venue Venue
token := getToken(r)
fmt.Println(token)
venue, err := getVenue(rs.db, token)
if err != nil {
log.Fatal(err)
return
}
venueID := venue.VenueID
if !(venueID > 0) {
http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)
return
}
employees, err := getEmployees(rs.db, venueID)
if err != nil {
log.Fatal(err)
return
}
fmt.Println(employees[0].EmployeeID)
employeesJSON, err := json.Marshal(employees)
if err != nil {
log.Fatal(err)
return
}
w.Write([]byte(employeesJSON))
}
这是我的客户代码:
func (rs *appResource) getEmployees(w http.ResponseWriter, r *http.Request) {
path := rs.url + "/employees"
fmt.Println(path)
res, err := rs.client.Get(path)
if err != nil {
log.Println("error in get")
log.Fatal(err)
http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)
return
}
defer res.Body.Close()
if res.StatusCode == 500 {
fmt.Printf("res.StatusCode: %d\n", res.StatusCode)
http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
return
}
if res.StatusCode == 404 {
fmt.Printf("res.StatusCode: %d\n", res.StatusCode)
http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)
return
}
body, err := ioutil.ReadAll(res.Body)
if err != nil {
log.Fatal(err)
http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
return
}
// here I want to return actual JSON to an iOS client
w.WriteHeader(http.StatusOK)
w.Write([]byte("{ok}"))
}
答案 0 :(得分:1)
您的代码当前正在打印的是结构的内容,而不是JSON。当您打印结构的内容时,默认情况下,您将仅打印该结构中的值。这意味着fmt.Println(employees.EmployeeList)
会产生类似以下内容:
[{0 Mark 1234 false} {0 John 3456 false}]
如果您还想打印字段值,则需要添加格式'verb'%+v
,该格式将打印字段名称。 fmt.Printf("%+v\n", employees.EmployeeList)
应该打印如下内容:
[{id:0 name:Mark pin:1234 active:false} {id:0 name:John pin:3456 active:false}]
我认为您真正想做的是将数据再次编组为JSON字符串,以便将内容写回给客户端。
答案 1 :(得分:0)
由于您有2个未使用的变量(err,listEmployees的err),我实际上对您的代码完全运行感到惊讶。 以任何可行的方式添加了fmt.Println,以便您可以在控制台上查看结果
type Employee struct {
ID int `json:"id"`
Name string `json:"name"`
Pin int `json:"pin"`
Active bool `json:"active"`
}
func (rs *appResource) listEmployees(w http.ResponseWriter, r *http.Request) {
employees, _:= getEmployees(rs.db)
employeesJSON, _:= json.Marshal(employees)
fmt.Ptintln(string(employeesJSON))
w.Write(employeesJSON)
}
另一个运行示例:
func main() {
emp := Employee{
ID: 1,
Name: "Mark",
Pin: 1234,
Active: true,
}
if jsn, err := json.Marshal(emp); err == nil {
fmt.Println(string(jsn))
} else {
log.Panic(err)
}
}
type Employee struct {
ID int `json:"id"`
Name string `json:"name"`
Pin int `json:"pin"`
Active bool `json:"active"`
}
输出:
{“ id”:1,“ name”:“ Mark”,“ pin”:1234,“ active”:true}
答案 2 :(得分:0)
您似乎想要的是转储json,在这里您转储了struct,您可以对结构进行的操作是在Printf中转储具有%+ v的键和值,请看这里:{{3 }}。