草庐IT

rest - golang 中特定于平台的反序列化?

coder 2024-07-13 原文

我正在访问 REST API 并取回一些数据。昨天我遇到了一个有趣的行为。我还没有理解它背后的确切原因。这就是我想在这里寻找的。 对于看起来像 -

{
    "id": 2091967,
    "first_name": "",
    "last_name": "",
    "email": "",
    "telephone": "",
    "timezone": "",
    "weekly_capacity": "",
    "has_access_to_all_future_projects": false,
    "is_contractor": false,
    "is_admin": false,
    "is_project_manager": false,
    "can_see_rates": false,
    "can_create_projects": false,
    "can_create_invoices": false,
    "is_active": false,
    "created_at": "2018-04-16T00:48:30Z",
    "updated_at": "2018-11-07T22:47:43Z",
    "default_hourly_rate": null,
    "cost_rate": null,
    "roles": [
        "blah"
    ],
    "avatar_url": ""
}

我使用了如下所示的函数来获取电子邮件 -

func GetUserEmail(userID int) string {
    resp := getFromSomething("https://something/users/" + strconv.Itoa(userID))
    var result map[string]string

    json.NewDecoder(resp.Body).Decode(&result)
    log.Printf("userEmail: %s", result["email"])
    return result["email"]
}

代码在我的 mac 上完美运行,我正在构建它 - env GOOS=linux go build -ldflags="-s -w"-o bin/something cmd/main.go 但是,它无法反序列化,并且在使用相同的构建命令时没有在 EC2 实例上打印任何内容。

但随后,我将 var result map[string]string 更改为 var result map[string]interface{},它在我的 EC2 实例和 mac 上都有效.

在返回之前,我还必须在最后对 interface{} 对象进行类型转换。

func GetUserEmail(userID int) string {
    resp := getFromSomething("https://something/users/" + strconv.Itoa(userID))
    var result map[string]interface{}

    json.NewDecoder(resp.Body).Decode(&result)
    log.Printf("userEmail: %s", result["email"])
    return result["email"].(string)
}

有没有人见过这样的事情?或者,有人知道为什么会这样吗?

我知道负载总是可以通过 var result map[string]interface{} 更好地表示,但我的问题是 - 为什么 var result 的早期表示map[string]string 在 Mac 上工作而不在 EC2 上工作?

Mac 上的 Go 版本 - go version go1.11.2 darwin/amd64 EC2 上的是 go version go1.10.3 linux/amd64

最佳答案

始终检查并处理错误。

Decode 返回的错误解释了这个问题。该应用程序正在尝试将数字、 bool 值和数组解码为字符串值。

var v map[string]string
err := json.NewDecoder(data).Decode(&v) // data is the JSON document from the question
fmt.Println(err)  // prints json: cannot unmarshal number into Go value of type string

Run it on the Playground .

此问题不是特定于平台的。为什么您会看到不同的结果,我有几个猜测:

  • 在不同平台上进行测试时使用了不同的 JSON 文档。
  • 问题指出命令 env GOOS=linux go build -ldflags="-s -w"-o bin/something cmd/main.go 用于构建 Mac 版本,但是此命令不会构建可在 Mac 上执行的二进制文件。也许您没有运行您认为正在运行的代码。

要么解码为您发现的 map[string]interface{},要么解码为具有您想要的一个字段的结构:

var v struct{ Email string }
if err := json.NewDecoder(data).Decode(&v); err != nil {
    // handle error
}
fmt.Println(v.Email) // prints the decoded email value.

Run it on the Playground .

关于rest - golang 中特定于平台的反序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53753230/

有关rest - golang 中特定于平台的反序列化?的更多相关文章

  1. ruby - 是否有用于序列化和反序列化各种格式的对象层次结构的模式? - 2

    给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最

  2. ruby-on-rails - carrierwave:在序列化动态属性上安装 uploader - 2

    首先,我使用的是rails3.1.3和来自master的carrierwavegithub仓库的分支。我使用after_init钩子(Hook)来确定基于属性的字段页面模型实例并为这些字段定义属性访问器将值存储在序列化哈希中(希望它清楚我是什么谈论)。这是我正在做的事情的精简版:classPage省略mount_uploader命令让我可以访问我想要的属性。但是当我安装uploader时出现错误消息说“nil类的未定义新方法”我在源代码中读到有方法read_uploader和扩展模块中的write_uploader。我如何必须覆盖这些来制作mount_uploader命令使用我的“虚拟

  3. ruby-on-rails - Restful 命令 - 2

    我是RESTful的新手。但是,我想在我的Rails应用程序中使用它。当我将它添加到我的routes.rbmap.resources:notes时,我得到了创建这些方法的路由:索引创建新编辑展示更新摧毁我想知道编辑/更新和创建/新建之间有什么区别?对于这些方法对如何变化以及每个方法对的作用,是否有任何标准定义? 最佳答案 标准定义如下:index-GET-所有(或部分)记录的Viewshow-GET-单个记录的View新-GET-发布以创建的表单创建-POST-创建新记录edit-GET-用于编辑单个记录的表单更新-PUT-更新记录

  4. ruby-on-rails - Rails 编辑序列化的 JSON 数据 - 2

    我有一个存储JSON数据的列。当它处于编辑状态时,我不知道如何显示它。serialize:value,JSON=f.fields_for:valuedo|ff|.form-group=ff.label:short=ff.text_field:short,class:'form-control'.form-group=ff.label:long=ff.text_field:long,class:'form-control' 最佳答案 代替=f.fields_for:valuedo|ff|请使用以下代码:=f.fields_for:va

  5. ruby-on-rails - 序列化时无法将空数组保存到数据库 - 2

    在RubyonRails中,如果数组为空,则具有序列化数组字段的模型将不会在.save()上更新,而它之前有数据。我正在使用:ruby2.2.1rails4.2.1sqlite31.3.10我创建了一个字段设置为文本的新模型:railsgmodel用户名:stringexample:text在我添加的User.rb文件中:serialize:example,Array我实例化了User类的一个新实例:test=User.new然后我保存用户以确保它正确保存:test.save()(0.1ms)begintransactionSQL(0.4ms)INSERTINTO"users"("cr

  6. ruby - Sinatra REST API 应用程序的身份验证 - 2

    我正在使用Sinatra构建一个API(在客户端使用Angular并希望其他人能够访问API)并且它也是一个OAuth提供者。我想知道采取什么最佳途径(利用现有的gem或从Warden推出自己的解决方案等)。在使用Rails之前使用过devise和doorkeeper进行身份验证和oauth,想知道Sinatra的最佳解决方案是什么。理想情况下,我不想要View或能够扩展/修改现有解决方案的操作,因为我纯粹将其作为API与之交互。 最佳答案 我最近使用S/O的以下答案做了同样的事情Whatisaverysimpleauthentic

  7. ruby - 加载使用 YAML 序列化的对象时调用初始化 - 2

    是否可以在使用YAML.load_file时强制Ruby调用初始化方法?我想调用该方法以便为我不序列化的实例变量提供值。我知道我可以将代码分解成一个单独的方法并在调用YAML.load_file之后调用该方法,但我想知道是否有更优雅的方法来处理这个问题。 最佳答案 我认为你做不到。由于您要添加的代码确实特定于要反序列化的类,因此您应该考虑在类中添加该功能。例如,让Foo成为您要反序列化的类,您可以添加一个类方法,例如:classFoodefself.from_yaml(yaml)foo=YAML::load(yaml)#editth

  8. ruby-on-rails - Ruby on Rails URL 中的资源映射(RESTful API) - 2

    我很难给出正确的答案,所以我会在这里征求我的问题。我正在研究RESTFulAPI。自然地,我有多种资源,其中一些由父子关系组成,一些是独立资源。我有点困难的地方是弄清楚如何让那些将根据我的API构建客户端的人更容易。情况是这样的。假设我有一个“街道”资源。每条街道都有多个住宅。SoStreet:has_manytoHomes和Homes:belongs_toStreet。如果用户想要在特定的home资源上请求HTTPGET,以下应该可行:http://mymap/streets/5/homes/10这允许用户获取ID为10的房屋的信息。直截了当。我的问题是,我授予用户访问权限是否违反了

  9. ruby-on-rails - REST API 文档生成 - 2

    是否有库提供用于编写​​RESTAPI文档的标记?我见过几家公司使用类似的文档模式,例如:http://api.teamlab.com/2.0/http://www.fullcontact.com/docs/?category=person我想知道他们是否使用相同的库或服务。本质上,该库应该根据标记文本生成用于API导航、搜索和显示的页面(很像用于ruby​​文档的YARD)。这是我目前发现的:rapi_docgem.这是一个article讨论用法。 最佳答案 你绝对应该看看Swagger.它是开源的,被数百个API使用,也被3sc

  10. ruby-on-rails - JSON 到 ActiveRecord(反序列化) - 2

    我正在使用Ruby、Grape和ActiveRecord构建一个网络API。来自ASP.NETWebAPI我习惯于从JSON到类对象的自动模型绑定(bind),然后可以使用EntityFramework保存。我一直在搜索一下,看看在使用ActiveRecord时是否有类似的东西,但没有发现任何让我觉得我遗漏了一些非常明显的东西。将JSON反序列化为ActiveRecord模型的最佳方法是什么?更新Matts回答对简单类型非常有效,但是当我有关联时,我收到以下错误:ActiveRecord::AssociationTypeMismatch:Connector(#7029771166878

随机推荐