簡體   English   中英

Go json.Unmarshall()適用於單個實體,但不適用於切片

[英]Go json.Unmarshall() works with single entity but not with slice

我正在將Go用於簡單的http客戶端。 這是我要解組的實體:

type Message struct {
    Id int64
    Timestamp int64
    Text string
    Author User
    LastEdited int64
}

type User struct {
    Id int64
    Name string
}

單個實體在JSON中如下所示:

{
    "text": "hello, can you hear me?",
    "timestamp": 1512964818565,
    "author": {
        "name": "andrea",
        "id": 3
    },
    "lastEdited": null,
    "id": 8
}

Go / json可以解組單個實體沒有問題:

var m Message

err = json.Unmarshal(body, &m)
if err != nil {
    printerr(err.Error())
}
println(m.Text)

但是,如果端點的返回是多個實體:

[
    {
        "text": "hello, can you hear me?",
        "timestamp": 1512964800981,
        "author": {
            "name": "eleven",
            "id": 4
        },
        "lastEdited": null,
        "id": 7
    }
]

然后,我將對應的Unmarshall更改為可在一片結構上工作,Go拋出錯誤:

var m []Message

err = json.Unmarshal(body, &m)
if err != nil {
    printerr(err.Error()) // unexpected end of JSON input
}

for i := 0; i < len(m); i++ {
    println(m[i].Text)
}

是什么賦予了?

對我來說工作正常(在操場上嘗試),您從哪里獲取有效載荷數據? 聽起來好像被截斷了。

package main

import (
    "encoding/json"
    "fmt"
)

type Message struct {
    Id         int64
    Timestamp  int64
    Text       string
    Author     User
    LastEdited int64
}

type User struct {
    Id   int64
    Name string
}

func main() {
    body := []byte(`[
    {
        "text": "hello, can you hear me?",
        "timestamp": 1512964800981,
        "author": {
            "name": "eleven",
            "id": 4
        },
        "lastEdited": null,
        "id": 7
    }
]`)

    var m []Message

    err := json.Unmarshal(body, &m)
    if err != nil {
        fmt.Printf("error: %v") // unexpected end of JSON input
    }

    for i := 0; i < len(m); i++ {
        fmt.Println(m[i].Text)
    }
}

運行它給出了這個輸出

hello, can you hear me?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM