首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jsonapi元帅切片

jsonapi元帅切片
EN

Stack Overflow用户
提问于 2017-07-10 21:17:30
回答 3查看 775关注 0票数 2

我有一段结构,我想使用https://github.com/google/jsonapi对其进行封送。

只有一个结构,一切都很好。我只是传递一个指针作为第二个参数。

代码语言:javascript
复制
package main

import (
    "fmt"
    "os"

    "github.com/google/jsonapi"
)

type Spider struct {
    ID       int `jsonapi:"primary,spiders"`
    EyeCount int `jsonapi:"attr,eye_count"`
}

func main() {
    jsonapi.MarshalPayload(os.Stdout, &Spider{ID: 2, EyeCount: 12})
    // {"data":{"type":"spiders","id":"2","attributes":{"eye_count":12}}}
}

然而,当我试图对一个片段做同样的事情时,情况就完全不同了。

首先,我将自己的切片转换为指向这些结构的指针片段(不知道这里还需要做什么,将指针传递到切片没有工作)。

代码语言:javascript
复制
spiders := []Spider{Spider{ID: 1, EyeCount: 8}, Spider{ID: 2, EyeCount: 12}}

var spiderPointers []*Spider
for _, x := range spiders {
    spiderPointers = append(spiderPointers, &x)
}
jsonapi.MarshalPayload(os.Stdout, spiderPointers)

它起作用了。说大也大吧。以下是问题所在:

代码语言:javascript
复制
{"data":[
  {"type":"spiders","id":"2","attributes":{"eye_count":12}},
  {"type":"spiders","id":"2","attributes":{"eye_count":12}}]}

最后一个元素是重复的,它替换了其他元素。

最后,我想出了一个可行的解决方案:

代码语言:javascript
复制
spiders := []Spider{Spider{ID: 1, EyeCount: 8}, Spider{ID: 2, EyeCount: 12}}
var spiderPointers []interface{}
for _, x := range spiders {
    var spider Spider
    spider = x
    spiderPointers = append(spiderPointers, &spider)
}

jsonapi.MarshalPayload(os.Stdout, spiderPointers)
// {"data":[{"type":"spiders","id":"1","attributes":{"eye_count":8}},
//          {"type":"spiders","id":"2","attributes":{"eye_count":12}}]}

但我相信一定有更好的方法,所以这个问题。

EN

回答 3

Stack Overflow用户

发布于 2017-07-13 18:41:04

好奇你能用这样的东西吗?

代码语言:javascript
复制
package main

import (
    "encoding/json"
    "fmt"
    "os"

    "github.com/google/jsonapi"
)

type Spider struct {
    ID       int `jsonapi:"primary,spiders"`
    EyeCount int `jsonapi:"attr,eye_count"`
}

func main() {
    // spiders is a slice of interfaces.. they can be unmarshalled back to spiders later if the need arises
    // you don't need a loop to create pointers either... so better in memory usage and a bit cleaner to read.. you can in theory load the []interface{} with a for loop as well since you mentioned getting this data from a db
    var spiders []interface{}
    spiders = append(spiders, &Spider{ID: 1, EyeCount: 8}, &Spider{ID: 2, EyeCount: 12})
    fmt.Println("jsonapi, MarshalPayload")
    jsonapi.MarshalPayload(os.Stdout, spiders)

    // test against marshall indent for sanity checking
    b, _ := json.MarshalIndent(spiders, "", " ")
    fmt.Println("marshall indent")
    fmt.Println(string(b))
}
票数 1
EN

Stack Overflow用户

发布于 2017-07-10 22:09:10

为什么不这样做either3

代码语言:javascript
复制
var spiders interface{}
db.Model(spiders).Select()
jsonapi.MarshalPayload(os.Stdout, spiders)
票数 0
EN

Stack Overflow用户

发布于 2022-01-29 07:58:52

你遇到的是指针问题,不是jsonapi问题。

当您在值上循环时,循环变量将被创建一次,并且该值会被一次又一次地重新分配。指向循环变量的指针将始终指向相同的地址,您只需不断更新该值。这将使您有一个重复相同指针的切片,所有这些指针都指向放置在那里的最后一个值。

解决方案是创建一个作用域闭包,捕获新变量中的值,然后使用该变量的指针。尝试以下几点:

代码语言:javascript
复制
spiders := []Spider{Spider{ID: 1, EyeCount: 8}, Spider{ID: 2, EyeCount: 12}}

var spiderPointers []*Spider
for _, x := range spiders {
    x := x // capture loop variable
    spiderPointers = append(spiderPointers, &x)
}
jsonapi.MarshalPayload(os.Stdout, spiderPointers)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45021734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档