- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我需要解码可能具有以下格式的 json 对象:
格式一:
{
"contactType": 2,
"value": "0123456789"
}
格式2:
{
"contactType": "MobileNumber",
"value": "0123456789"
}
我用于解码的结构是:-
type Contact struct {
ContactType int `json:"contactType"`
Value string `json:"value"`
}
但这仅适用于格式 1。我不想更改 ContactType 的数据类型,但我也想适应第二种格式。我听说过 json.RawMarshal 并尝试使用它。
type Contact struct {
ContactType int
Value string `json:"value"`
Type json.RawMessage `json:"contactType"`
}
type StringContact struct {
Type string `json:"contactType"`
}
type IntContact struct {
Type int `json:"contactType"`
}
这完成了解码,但我无法设置 ContactType
变量,该变量取决于 json.RawMessage
的类型。如何为我的结构建模才能解决这个问题?
最佳答案
您需要自己进行解码。有一篇非常好的文章展示了如何正确使用 json.RawMessage 以及针对这个问题的许多其他解决方案,例如使用接口(interface)、RawMessage、实现您自己的解码和解码功能等。
您可以在此处找到该文章:JSON decoding in GO by Attila Oláh注意:Attila 在他的代码示例中犯了一些错误。
我冒昧地整理(使用来自 Attila 的一些代码)一个使用 RawMessage 延迟解码的工作示例,这样我们就可以在我们自己的解码函数版本上完成它。
package main
import (
"fmt"
"encoding/json"
"io"
)
type Record struct {
AuthorRaw json.RawMessage `json:"author"`
Title string `json:"title"`
URL string `json:"url"`
Author Author
}
type Author struct {
ID uint64 `json:"id"`
Email string `json:"email"`
}
func Decode(r io.Reader) (x *Record, err error) {
x = new(Record)
if err = json.NewDecoder(r).Decode(x); err != nil {
return
}
if err = json.Unmarshal(x.AuthorRaw, &x.Author); err == nil {
return
}
var s string
if err = json.Unmarshal(x.AuthorRaw, &s); err == nil {
x.Author.Email = s
return
}
var n uint64
if err = json.Unmarshal(x.AuthorRaw, &n); err == nil {
x.Author.ID = n
}
return
}
func main() {
byt_1 := []byte(`{"author": 2,"title": "some things","url": "https://stackoverflow.com"}`)
byt_2 := []byte(`{"author": "Mad Scientist","title": "some things","url": "https://stackoverflow.com"}`)
var dat Record
if err := json.Unmarshal(byt_1, &dat); err != nil {
panic(err)
}
fmt.Printf("%#s\r\n", dat)
if err := json.Unmarshal(byt_2, &dat); err != nil {
panic(err)
}
fmt.Printf("%#s\r\n", dat)
}
希望这对您有所帮助。
关于json - 使用 json.RawMessage 将 json 解码为结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39223754/
[]json.Rawmessage 是什么意思。它在这个结构中: type Request struct { Jsonrpc string `json:"jsonrpc"
尝试将结构转换为 []json.RawMessage。我的理解是 json.Marshal() 将它转换为 byte[],就像 []json.RawMessage 一样。然而,我似乎无法在两者之间转换
我在 golang 中有字节数组: obj_data, _ := json.Marshal(obj) 并且想要将这个字节数组设置为 json.RawMessage我认为它会起作用: data := j
本节Interface checks from Effective Go推荐 var _ json.Marshaler = (*RawMessage)(nil) 作为编译时检查 RawMessage
背景 我正在处理必须为 non-repudiable 的 JSON 数据. 授予我这些数据的 API 也有一个服务来验证数据最初来自他们。 As best as I can tell ,他们通过要求他
我正在使用 python boto 2.8,但无法删除消息。这是我的测试代码: conn = boto.sqs.connect_to_region("us-east-1",
是否可以在 Golang 中创建 json.RawMessage 文字? 我希望能够做这样的事情: type ErrorMessage struct { Timestamp string
我正在尝试创建一个方法扩展来检查我的结构是否已初始化,但我收到此错误: invalid operation: myStruct literal == inStruct (struct containi
这是对 JSON sometimes array sometimes object 的跟进 在最初的问题中,我询问了如何处理:“我正在使用一个可能为变量返回字符串或可能为变量返回数组的 json AP
请在此处找到代码 http://play.golang.org/p/zdQ14ItNBZ 我将 JSON 数据保存为 RawMessage,但无法将其解码。我需要对包含结构进行编码和解码,但我希望仍然
我有这个结构 type SyncInfo struct { Target string } 现在我从 ElasticSearch 查询一些 json 数据。 Source 是 json.Raw
我无法思考如何解码来自先前解码的 json 字节数组的原始 json 字符串。我有当前代码: type Message struct { Event string Data json.
在下面的示例中,我尝试使用反射将 Unmarshal 一个 json.RawMessage 放入一个 slice 中,以确定 json 中的项目类型.RawMessage,json.RawMessag
我需要解码可能具有以下格式的 json 对象: 格式一: { "contactType": 2, "value": "0123456789" } 格式2: { "contact
我运行以下代码: package main import ( "encoding/json" "fmt" ) func main() { raw := json.RawMess
尝试编码此结构时出现以下错误 json: error calling MarshalJSON for type json.RawMessage: unexpected end of JSON inpu
几周前,我开始学习 go 并尝试在学习基础知识的同时构建一个简单的博客应用程序。 目前我正在尝试使用 database/sql 和 github.com/lib/pq 包来获取和保存博客文章。我不喜欢
使用嵌入了 json 的结构会出现奇怪的行为。 package main import ( "database/sql" "encoding/json" "fmt" _
我想解码 var j = []byte(`[{"major":1},{"minor":0}]`) 进入 type Version struct { Major int `json:"major
我有一个: type User struct { UID int `json:"id"` FirstName
我是一名优秀的程序员,十分优秀!