douye6812 2019-03-16 10:33
浏览 4
已采纳

如何将结构片段编组为有效的JSON

I'm writing a Golang api and client but can't get valid json from a slice of structs in the api. The result I get in my client looks like this.

[{0 Mark 1234 false} {0 John 3456 false}]

I need this json to look like

[{"id":0, "name":Mark, "pin":1234, "active":false} {"id":0, "name":John, "pin":3456, "active":false}]

I can't find examples showing me how to code this properly and this is not a duplicate of anything I can find despite a warning that it is. While my client successfully parses the JSON back to a struct, I also need it to return JSON to an IOS client which is requesting it. The flow is API -> API -> iOS client. I don't know how to produce JSON from the struct for the iOS client.

Here is my api code.

// 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))

}

Here is my client code:

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
", res.StatusCode)
        http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
        return

    }

    if res.StatusCode == 404 {
        fmt.Printf("res.StatusCode: %d
", 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}"))
}
  • 写回答

3条回答 默认 最新

  • dphs48626 2019-03-16 11:24
    关注

    What your code is currently printing is the content of a struct, not JSON. When you print the contents of a struct, by default, you will print just the values within that struct. That means that fmt.Println(employees.EmployeeList) will produce something like:

    [{0 Mark 1234 false} {0 John 3456 false}]
    

    If you want to also print field values, you'll need to add a format 'verb' %+v which will print field names. fmt.Printf("%+v ", employees.EmployeeList) should print something like:

    [{id:0 name:Mark pin:1234 active:false} {id:0 name:John pin:3456 active:false}]
    

    I think what you actually want to look at doing is marshalling your data back into a JSON string again in order to write that content back out for the client.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改