2017-08-25 6 views
1

Ich fange gerade an, GoLang heute zu lernen, ich versuche, einen einfachen Rest API Web Server zu bauen.Gibt es eine Möglichkeit, diesen JSON in Golang zu formatieren?

Hier ist die Antwort Struct ich für jede Anfrage an den Webserver senden möchten:

package main 

type HttpResp struct{ 
    Status  int   `json:"status"` 
    Description string  `json:"description"` 
    Body  string  `json:"body"` 
} 

Und hier ist meine articles.go Datei, die die Funktion haben, die alle Artikel in der Datenbank bekommt:

package main 

import (
    "encoding/json" 
    "net/http" 
    "log" 
) 

type Article struct{ 
    Id   string `json:"id"` 
    Title  string `json:"title"` 
    Body  string `json:"body"` 
    Description string `json:"description"` 
} 

func AllArticles(w http.ResponseWriter, r *http.Request){ 
    log.Print("/articles - GET") 
    db := connect() 
    defer db.Close() 

    var articles []Article 
    results, err := db.Query("SELECT * FROM Articles") 

    if err != nil{ 
     log.Print(err) 
     return 
    } 

    for results.Next(){ 
     var article Article 
     err = results.Scan(&article.Title, &article.Description, &article.Body, &article.Id) 

     if err != nil{ 
      serr, _ := json.Marshal(err) 
      json.NewEncoder(w).Encode(HttpResp{Status: 500, Description: "Failed to retrieve all articles", Body: string(serr)}) 
     } 

     articles = append(articles, article) 
    } 
    sarr, _ := json.Marshal(articles) 

    w.Header().Set("Content-Type", "application/json") 
    json.NewEncoder(w).Encode(HttpResp{Status: 200, Body: string(sarr)}) 
} 

die Frage, die ich hier mit Blick auf bin ist, dass die Antwort ist wie folgt:

{ "status" 200, "Beschreibung": "", "body": "[{\" id \ "\" 1 \ "\ "title \" \ "First \" \" body \ ": \" die ist ein Testkörper \ "\ "Beschreibung \": \ "Dies ist ein Test \"}]"}

ich den Körper möchte nur JSON und nicht sein ein Faden. Wie kann ich das erreichen?

+1

Es ist nur doppelt codiert, weil Ihr Code es doppelt kodiert. Sie kodieren den Körper in JSON, dann fügen Sie diesen JSON in ein Feld einer anderen Struktur ein und kodieren dann * das * zu JSON. Wenn Sie das nicht tun, erhalten Sie die gewünschten Ergebnisse. – Adrian

+1

Das ist auch nützlich https://mholt.github.io/json-to-go/ – RayfenWindspear

Antwort

1

Kein Punkt beim Rangieren der Körper getrennt von der HttpResp. Ändern Sie stattdessen den Feldtyp Body in interface{} und legen Sie dann das Feld auf einen beliebigen Wert eines konkreten Typs im Gegensatz zu einer JSON-Zeichenfolge, z. []Article und dann marschieren Sie die resp einmal.

type HttpResp struct{ 
    Status  int   `json:"status"` 
    Description string  `json:"description"` 
    Body  interface{} `json:"body"` 
} 

Und der Rest ...

package main 

import (
    "encoding/json" 
    "net/http" 
    "log" 
) 

type Article struct{ 
    Id   string `json:"id"` 
    Title  string `json:"title"` 
    Body  string `json:"body"` 
    Description string `json:"description"` 
} 

func AllArticles(w http.ResponseWriter, r *http.Request){ 
    log.Print("/articles - GET") 
    db := connect() 
    defer db.Close() 

    var articles []Article 
    results, err := db.Query("SELECT * FROM Articles") 

    if err != nil{ 
     log.Print(err) 
     return 
    } 

    for results.Next(){ 
     var article Article 
     err = results.Scan(&article.Title, &article.Description, &article.Body, &article.Id) 

     if err != nil{ 
      serr, _ := json.Marshal(err) 
      json.NewEncoder(w).Encode(HttpResp{Status: 500, Description: "Failed to retrieve all articles", Body: string(serr)}) 
     } 

     articles = append(articles, article) 
    } 

    w.Header().Set("Content-Type", "application/json") 
    json.NewEncoder(w).Encode(HttpResp{Status: 200, Body: articles}) 
} 
+0

Ja! Vielen Dank ! Ich habe angefangen, es vor 4 Stunden zu lernen, habe aber noch nichts über den Interface-Typ gelernt, ich werde etwas darüber lesen. –

Verwandte Themen