2017-08-30 111 views
0

我有一個結構,因爲這:元帥INT切片串線

type Int64Slice []int64 
type DataWrapper struct { 
    ListId Int64Slice `json:"listid" required` 
    Domain string `json:"domain" required` 
    Name string `json:"name,omitempty"` 
} 

,我需要它變成:

{ 
    "listid": "1 2 3 4 5", 
    "domain": "mydomain" 
} 

我已經寫了自定義MarshalJSON:

func (u Int64Slice) MarshalJSON() ([]byte, error) { 
    var result string 
    if u == nil { 
     result = "null" 
    } else { 
     result = strings.Trim(strings.Join(strings.Fields(fmt.Sprint(u)), " "), "[]") 
     Logger.Debugln(result) 
    } 
    return []byte(result), nil 
} 

func (d *DataWrapper) ToJSON() []byte { 
    result, err := json.Marshal(d) 
    if err != nil { 
     log.Fatalln(err) 
     panic(err) 
    } 
    return result 
} 

在行Logger.Debugln(result),它打印此結果:

20170830090317506 20170830090026319 20170830111023194 201708301043081 ...

JSON:錯誤調用MarshalJSON類型models.Int64Slice:無效 字符 '2' 後的頂級價值

+2

你需要的數字括入雙引號。 – mkopriva

+0

https://play.golang.org/p/krzFBLJWwG – mkopriva

+0

是否有特殊原因不使用切片? JSOn中的某個列表應該表示爲一個數組。 –

回答

1

我覺得你有它向後。 使用bytes.Buffer類型可逐步構建數據的字符串表示形式。

程序

package main 

import (
    "bytes" 
    "encoding/json" 
    "os" 
    "strconv" 
) 

type Int64Slice []int64 

func (s Int64Slice) MarshalJSON() ([]byte, error) { 
    if s == nil { 
     return []byte("null"), nil 
    } 

    var b bytes.Buffer 
    b.WriteByte('"') 
    for i, v := range s { 
     if i > 0 { 
      b.WriteByte('\x20') 
     } 
     b.WriteString(strconv.FormatInt(v, 10)) 
    } 

    b.WriteByte('"') 
    return b.Bytes(), nil 
} 

func main() { 
    var (
     a Int64Slice = nil 
     b = Int64Slice{ 
      42, 
      12, 
      0, 
     } 
    ) 
    enc := json.NewEncoder(os.Stdout) 
    enc.Encode(a) 
    enc.Encode(b) 
} 

打印:

null 
"42 12 0" 

Playground link

+0

許多答案指出了問題的原因 - 雙引號。由於性能的提高,我會選擇最好的。感謝大家順便說一句 –

2

20170830090317506 20170830090026319 20170830111023194 201708301043081不是有效的JSON值。它被解釋爲一個有效的數字(20170830090317506),後面跟着一個有效的空格,然後是無效的數據,從2開始;因此你觀察到的錯誤。

它需要引號的:

試着這麼做:

result = `"` + strings.Trim(strings.Join(strings.Fields(fmt.Sprint(u)), " "), "[]") + `"`