简体   繁体   English

Go json.Unmarshall()适用于单个实体,但不适用于切片

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

I'm using Go for a simple http client. 我正在将Go用于简单的http客户端。 Here's the entity I'm unmarshalling: 这是我要解组的实体:

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

type User struct {
    Id int64
    Name string
}

A single entity looks like this in JSON: 单个实体在JSON中如下所示:

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

Go/json has no problem unmarshalling the single entity: Go / json可以解组单个实体没有问题:

var m Message

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

However, if the return of the endpoint is multiple entities: 但是,如果端点的返回是多个实体:

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

And I change my corresponding Unmarshall to work on a slice of structs, Go throws an error: 然后,我将对应的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)
}

What gives? 是什么赋予了?

Works fine for me (try it on playground ), where are you getting the payload data from? 对我来说工作正常(在操场上尝试),您从哪里获取有效载荷数据? sounds like that's truncating it. 听起来好像被截断了。

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)
    }
}

running it gives this output 运行它给出了这个输出

hello, can you hear me?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM