首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将JSON解封为struct

将JSON解封为struct
EN

Stack Overflow用户
提问于 2017-11-01 09:14:49
回答 2查看 4.6K关注 0票数 2

当JSON字符串中给定了struct类型时,如何将JSON字符串解封为struct。这是我的密码:

代码语言:javascript
复制
package main

import (
    "fmt"
    "encoding/json"
)

type ServiceResult struct {
    Type    string      `json:"type"`
    Content interface{} `json:"content"`
}

type Person struct {
    Name string `json:"name"`
}

func main() {

    nikola := ServiceResult{}
    nikola.Type = "Person"
    nikola.Content = Person{"Nikola"}

    js, _ := json.Marshal(nikola)
    fmt.Println("Marshalled object: " + string(js))
}

现在,我想从这个JSON字符串中创建一个新的人,但是必须从JSON字符串中读取该类型。

代码语言:javascript
复制
{"type":"Person","content":{"name":"Nikola"}}
EN

回答 2

Stack Overflow用户

发布于 2017-11-01 09:29:06

首先,对于你的类型

代码语言:javascript
复制
type ServiceResult struct {
    Type    string      `json:"type"`
    Content interface{} `json:"content"`
}

您需要通过定义一个方法来实现“自定义JSON解组器”:

代码语言:javascript
复制
func (sr *ServiceResult) UnmarshalJSON(b []byte) error

为了使您的类型满足encoding/json.Unmarshaler接口--这将使JSON解码器在解封送处理到该类型的值时调用该方法。

在该方法中,可以使用助手类型。

代码语言:javascript
复制
type typedObject struct {
    Type    string          `json:"type"`
    Content json.RawMessage `json:"content"`
}

首先将该b片解编组到其中。

如果解封送处理完成了产生错误的w/o,则typedObject类型的值将使字符串描述其Type字符串中的类型,而包含在其Content字段中的"content“字段中的原始(未解析) JSON字符串。

然后执行switch (或地图查找或其他任何操作)来选择实际的Go类型,将Content字段中的任何数据解封到其中,如下所示:

代码语言:javascript
复制
var value interface{}
switch sr.Type {
case "person":
    value = new(Person)
case "car":
    value = new(Car)
}
err = json.Unmarshal(sr.Content, value)

…如果这些PersonCar是具体的结构类型,可以适当地武装起来供encoding/json使用。

请阅读以充分了解这些概念。

票数 3
EN

Stack Overflow用户

发布于 2017-11-01 09:28:57

当您从ServiceResult创建实例时,您也可以使用person插入内容,然后解压缩它:

代码语言:javascript
复制
service := ServiceResult{Content: Person{}}
json.Unmarshal(data, &service)
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47051538

复制
相关文章

相似问题

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