2017-05-08 3 views
2

Je construis une API REST en utilisant Golang mais j'ai quelques problèmes à essayer de Marshalling correctement une tranche de Json. Je me gratte la tête depuis un moment maintenant, même après avoir regardé plusieurs questions et réponses et sur le web.Marshall JSON Tranche à valide JSON

Essentiellement, j'ai une Redis client qui a appelé après un appel -X GET /todo/ régurgite une tranche de todos

[{"content":"test6","id":"46"} {"content":"test5","id":"45"}] //[]string 

Maintenant, je veux revenir un donné Response basé sur le fait que je l'ai trouvé todos ou pas, donc j'ai un Struct comme

type Response struct { 
    Status string 
    Data []string 
} 

Ensuite, Si je trouvais un peu todos je viens Marshal JSON avec

if(len(todos) > 0){ 
    res := SliceResponse{"Ok", todos} 
    response, _ = json.Marshal(res) 
} 

Et, afin d'éliminer \ inutiles dans la réponse, j'utilise bytes.Replace comme

response = bytes.Replace(response, []byte("\\"), []byte(""), -1) 

Enfin, obtenir

{ 
    "Status" : "Ok", 
    "Data" : [ 
       "{"content":"test6","id":"46"}", 
       "{"content":"test5","id":"45"}" 
    ] 
} 

Comme vous pouvez le voir chaque " avant chaque { et après chaque }, à l'exclusion du premier et du dernier, sont cl mal tôt. Alors que le JSON correct serait

{ 
    "Status": "Ok", 
    "Data": [{ 
     "content ": "test6", 
     "id ": "46" 
    }, { 
     "content ": "test5", 
     "id ": "45" 
    }] 
} 

je réussi à les sortir en trouvant leur index et les couper et aussi avec regex mais je me demandais.

Existe-t-il un moyen propre et meilleur d'y parvenir?

+0

Pourquoi quittez-vous la réponse Redis sous forme de chaînes, et non pas un type plus concret? Votre modèle de données a ces lignes comme des chaînes, donc bien sûr, il doit échapper les citations pour les mettre dans json. Si votre code json implique un traitement de chaîne, vous faites quelque chose de mal. – captncraig

+0

En utilisant [go-redis] (https://github.com/go-redis/redis) et 'todos, _: = c.LRange (" todos ", 0, -1) .Result()' renvoie un ' [] chaîne de caractères – AndreaM16

+0

Vous pourriez peut-être analyser chaque élément à un type struct. Vérification d'une solution alternative maintenant – captncraig

Répondre

3

Dans la mesure du possible, vous devriez aller chercher des objets qui correspondent à votre json désiré. Je recommande l'analyse syntaxique du JSON Redis:

type Response struct { 
    Status string 
    Data []*Info 
} 

type Info struct { 
    Content string `json:"content"` 
    ID  string `json:"id"` 
} 

func main() { 
    r := &Response{Status: "OK"} 
    for _, d := range data { 
     info := &Info{} 
     json.Unmarshal([]byte(d), info) 
     //handle error 
     r.Data = append(r.Data, info) 
    } 
    dat, _ := json.Marshal(r) 
    fmt.Println(string(dat)) 
} 

Playground Link

+0

Parfait, merci Olivia! – AndreaM16