2016-02-14 111 views
0

嗨我是從外部API獲取的WebSocket信息,它是給我這樣的JSON響應:解碼JSON包括JSON編碼字符串

`{"name":"message","args":["{\"method\":\"chatMsg\",\"params\":{\"channel\":\"channel\",\"name\":\"name\",\"nameColor\":\"B5B11E\",\"text\":\"<a href=\\\"https://play.spotify.com/browse\\\" target=\\\"_blank\\\">https://play.spotify.com/browse</a>\",\"time\":1455397119}}"]}` 

我把它歸到這個STRUC

type main struct { 

Name string `json:"name"` 
Args []arg `json:"args"` 
} 

type arg struct { 
    Method string`json:"method"` 
    Params par `json:"params"` 
} 
type par struct { 
    Channel  string `json:"channel,omitempty"` 
    Name  string `json:"name,omitempty"` 
    NameColor string `json:"nameColor,omitempty"` 
    Text  string `json:"text,omitempty"` 
    Time  int64 `json:"time,omitempty"` 
} 

與代碼

sReplace := strings.NewReplacer(`"{`, "{", `"]`, "]", "\\", ``) 
strN := sReplace.Replace(str) 
r := strings.NewReader(strN) 
d := json.NewDecoder(r) 
m := main{} 

我收到錯誤

對其進行解碼
invalid character 'h' after object key:value pair 

我知道錯誤是文本字段值的結果。有沒有什麼好的方法來清除它或告訴解碼器忽略文本字段的內容?

回答

2

該應用程序正在解析包含子字符串"text":"<a href="https的數據。這不是有效的JSON。錯誤消息抱怨href中的h

因爲JSON值包括編碼的JSON值,應用程序必須分兩步進行解碼:

type main struct { 
    Name string `json:"name"` 
    Args []string `json:"args"` 
} 

type arg struct { 
    Method string `json:"method"` 
    Params par `json:"params"` 
} 
type par struct { 
    Channel string `json:"channel,omitempty"` 
    Name  string `json:"name,omitempty"` 
    NameColor string `json:"nameColor,omitempty"` 
    Text  string `json:"text,omitempty"` 
    Time  int64 `json:"time,omitempty"` 
} 

str := `{"name":"message","args":["{\"method\":\"chatMsg\",\"params\":{\"channel\":\"channel\",\"name\":\"name\",\"nameColor\":\"B5B11E\",\"text\":\"<a href=\\\"https://play.spotify.com/browse\\\" target=\\\"_blank\\\">https://play.spotify.com/browse</a>\",\"time\":1455397119}}"]}` 
var m main 
if err := json.Unmarshal([]byte(str), &m); err != nil { 
    log.Fatal(err) 
} 
var args arg 
if err := json.Unmarshal([]byte(m.Args[0]), &args); err != nil { 
    log.Fatal(err) 
} 

playground example

+0

哇非常感謝你我試圖整天弄明白。這struc和json總是困難的地方:( – user3398940