jjzjj

json - Go json.Unmarshal() 适用于单个实体但不适用于 slice

coder 2024-07-05 原文

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

什么给了?

最佳答案

对我来说效果很好(在 playground 上尝试),您从哪里获取有效负载数据?听起来像是在截断它。

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?

关于json - Go json.Unmarshal() 适用于单个实体但不适用于 slice ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47746431/

有关json - Go json.Unmarshal() 适用于单个实体但不适用于 slice的更多相关文章

  1. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  2. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  3. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  4. ruby - inverse_of 是否适用于 has_many? - 2

    当我使用has_one时,它​​工作得很好,但在has_many上却不行。在这里您可以看到object_id不同,因为它运行了另一个SQL来再次获取它。ruby-1.9.2-p290:001>e=Employee.create(name:'rafael',active:false)ruby-1.9.2-p290:002>b=Badge.create(number:1,employee:e)ruby-1.9.2-p290:003>a=Address.create(street:"123MarketSt",city:"SanDiego",employee:e)ruby-1.9.2-p290

  5. ruby-on-rails - 如何使用 Rack 接收 JSON 对象 - 2

    我有一个非常简单的RubyRack服务器,例如:app=Proc.newdo|env|req=Rack::Request.new(env).paramspreq.inspect[200,{'Content-Type'=>'text/plain'},['Somebody']]endRack::Handler::Thin.run(app,:Port=>4001,:threaded=>true)每当我使用JSON对象向服务器发送POSTHTTP请求时:{"session":{"accountId":String,"callId":String,"from":Object,"headers":

  6. ruby - 用 YAML.load 解析 json 安全吗? - 2

    我正在使用ruby2.1.0我有一个json文件。例如:test.json{"item":[{"apple":1},{"banana":2}]}用YAML.load加载这个文件安全吗?YAML.load(File.read('test.json'))我正在尝试加载一个json或yaml格式的文件。 最佳答案 YAML可以加载JSONYAML.load('{"something":"test","other":4}')=>{"something"=>"test","other"=>4}JSON将无法加载YAML。JSON.load("

  7. ruby - "undefined method"用于 rails 模型 - 2

    我正在使用带有Rails的Devise,我想添加一个方法“getAllComments”,所以我这样写:classUser在我的Controller中:defdashboard@user=current_user@comments=@user.getAllComments();end当我访问我的url时,我得到了undefinedmethod`getAllComments'for#我做错了什么?谢谢 最佳答案 因为getAllComments是一个类方法,而您正试图将其作为实例方法访问。您要么需要访问它:User.getAllCom

  8. Ruby on Rails regexp equals-tilde 与 array include 用于检查选项列表 - 2

    我正在使用Rails3.2.3和Ruby1.9.3p0。我发现我经常需要确定某个字符串是否出现在选项列表中。看来我可以使用Ruby数组.includemethod:或正则表达式equals-tildematchshorthand用竖线分隔选项:就性能而言,一个比另一个好吗?还有更好的方法吗? 最佳答案 总结:Array#include?包含String元素,在接受和拒绝输入时均胜出,对于您的示例只有三个可接受的值。对于要检查的更大的集合,看起来Set#include?和String元素可能会获胜。如何测试我们应该根据经验对此进行测试

  9. ruby-on-rails - 将保存回调添加到单个 ActiveRecord 实例,可以吗? - 2

    是否可以为单个ActiveRecord实例添加回调?作为进一步的限制,这是继续使用库,所以我无法控制该类(除了对其进行猴子修补)。这或多或少是我想做的:defdo_something_creazymessage=Message.newmessage.on_save_call:do_even_more_crazy_stuffenddefdo_even_more_crazy_stuff(message)puts"Message#{message}hasbeensaved!Hallelujah!"end 最佳答案 你可以通过在创建对象后立

  10. ruby-on-rails - Rails 渲染带有驼峰命名法的 json 对象 - 2

    我在一个简单的RailsAPI中有以下Controller代码:classApi::V1::AccountsControllerehead:not_foundendendend问题在于,生成的json具有以下格式:{id:2,name:'Simpleaccount',cash_flows:[{id:1,amount:34.3,description:'simpledescription'},{id:2,amount:1.12,description:'otherdescription'}]}我需要我生成的json是camelCase('cashFlows'而不是'cash_flows'

随机推荐