2013-12-15 5 views
2

У меня есть-структуру, как это:Golang JSON кодирования для разбора с JavaScript

type User struct { 
    Login   string `json:",string"` 
    PasswordNonce Nonce  `json:",string"` 
    PasswordHash HashValue `json:",string"` 
    CreatedOn  time.Time `json:",string"` 
    Email   string `json:",string"` 
    PhoneNumber string `json:",string"` 
    UserId  Id  `json:",string"` 
} 

код, который генерирует JSON и отправляет его заключается в следующем:

func AddUserHandler(w http.ResponseWriter, r *http.Request) { 
    var userRecord model.User 
    encoder := json.NewEncoder(w) 
    err = encoder.Encode(userRecord) 
    if err != nil { 
     panic(err) 
    } 
} 

Когда я кодировать его с Голанг, встроенный в кодер JSON, имена полей отображаются без кавычек, что предотвращает чтение JSON.parse в узле.js. Кто-нибудь знает об этом?

Спасибо!

+0

Предполагаю, что вы используете json.Marshal правильно? – robbmj

+0

Я использовал 'encoder: = json.NewEncoder (w)', а затем 'encoder.Encode (data)' где w является 'http.ResponseWriter' – user1094206

+0

Можете ли вы отправить этот бит кода? Это может быть актуально. – robbmj

ответ

0

Вы можете попробовать использовать json.Marshal

jsonData, err := json.Marshal(data) 
1
package main 

import (
    "encoding/json" 
    "math/rand" 
    "net/http" 
    "time" 
) 

type Nonce [32]byte 
type HashValue [32]byte 
type Id [32]byte 

func MakeNonce() Nonce { 
    return makeByte32() 
} 

func MakeHashValue() HashValue { 
    return makeByte32() 
} 

func MakeId() Id { 
    return makeByte32() 
} 

func makeByte32() [32]byte { 
    bytes := [32]byte{} 
    rand.Seed(time.Now().Unix()) 
    for i, _ := range bytes { 
     bytes[i] = byte(48 + (rand.Float64() * 10)) 
    } 
    return bytes 
} 

type User struct { 
    Login   string 
    PasswordNonce Nonce 
    PasswordHash HashValue 
    CreatedOn  time.Time 
    Email   string 
    PhoneNumber string 
    UserId  Id 
} 

type myHandler struct { 
    userRecord User 
} 

func (mh myHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { 
    encoder := json.NewEncoder(w) 
    err := encoder.Encode(mh.userRecord) 

    if err != nil { 
     panic(err) 
    } 
} 

func main() { 
    user := User{ 
     "test", 
     MakeNonce(), 
     MakeHashValue(), 
     time.Now(), 
     "[email protected]", 
     "5195555555", 
     MakeId(), 
    } 

    h := myHandler{user} 
    http.ListenAndServe("localhost:4000", h) 
} 
2

Это была моя ошибка. Проблема была в коде Javascript. Я использую пакет запросов node.js, и он, по-видимому, анализирует ответы JSON по умолчанию. В следующем коде response.body уже является картой, содержащей анализируемое содержимое строки JSON:

var request = require('request'); 

var options = { 
    uri: 'http://localhost:3000/AddUser', 
    method: 'POST', 
    json: {} 
}; 

request(options, function(error, response, body) { 
    console.log(error) 
    console.log(response.body) 
    console.log(response.body["UserId"]) 
    data = response.body 
    // data = JSON.parse(response.body) gives an error... 
}); 
Смежные вопросы