我正在使用JSON,它返回三种不同的对象类型“项目”,“类别”和“修饰符”。可以在此处查看JSON的示例。我为三种类型的对象创建了模型。但是当我解组时,我选择了一种类型来解组整个JSON。(我知道这不可能是正确的方法…)然后,我尝试根据不同的类型来解析不同的项目,如json字段“类型”,然后将该对象附加到适当类型的切片中。我遇到错误,因为我不知道如何解组其中具有不同字段且具有不同类型的JSON。
解封包含不同对象的JSON的正确方法是什么,每个对象都有各自的字段?
是创建包含所有可能字段然后解组的“超级模型”的解决方案吗?
我还很新,不胜感激。谢谢!
如果实现json.Unmarshaler,则可以定义一个将每种项目类型解析为相关结构的结构。
例:
// Dynamic represents an item of any type.
type Dynamic struct {
Value interface{}
}
// UnmarshalJSON is called by the json package when we ask it to
// parse something into Dynamic.
func (d *Dynamic) UnmarshalJSON(data []byte) error {
// Parse only the "type" field first.
var meta struct {
Type string
}
if err := json.Unmarshal(data, &meta); err != nil {
return err
}
// Determine which struct to unmarshal into according to "type".
switch meta.Type {
case "product":
d.Value = &Product{}
case "post":
d.Value = &Post{}
default:
return fmt.Errorf("%q is an invalid item type", meta.Type)
}
return json.Unmarshal(data, d.Value)
}
// Product and Post are structs representing two different item types.
type Product struct {
Name string
Price int
}
type Post struct {
Title string
Content string
}
用法:
func main() {
// Parse a JSON item into Dynamic.
input := `{
"type": "product",
"name": "iPhone",
"price": 1000
}`
var dynamic Dynamic
if err := json.Unmarshal([]byte(input), &dynamic); err != nil {
log.Fatal(err)
}
// Type switch on dynamic.Value to get the parsed struct.
// See https://tour.golang.org/methods/16
switch dynamic.Value.(type) {
case *Product:
log.Println("got a product:", dynamic.Value)
case *Post:
log.Println("got a product:", dynamic.Value)
}
}
输出:
2009/11/10 23:00:00得到了一个产品:&{iPhone 1000}
在Go Playground中尝试一下。
提示:如果您有动态对象列表,只需将其解析为Dynamic
:
var items []Dynamic
json.Unmarshal(`[{...}, {...}]`, &items)
输出示例:
[&{iPhone 1000}&{A Good Post Lorem ipsum …}]
问题内容: 我想解析一些json数据。数据如下所示: {“ id”:“ someId”,“ key_1”:“ value_1”,“ key_2”:“ value_2”,“ key_3”:“ value_3”,“点数”:[[1487100466412,“ 50.032178”,“ 8.526018”,300 ,0.0,26,0],[1487100471563,“ 50.030869”,“ 8.525
问题内容: 嗨,我在解组嵌套的JSON数组时遇到问题。我应该创建什么结构?我想避免使用尽可能多的东西,但是我真的不知道在这种情况下是否有可能。 杰森,我想解组: 和我想用来解组的结构: 链接到示例:https : //play.golang.org/p/owuMptNrix 问题答案: 是的,答案只是一小部分: 好感谢你的问题,我发现这个错误的工具,我总是用它的Json操作一起去,它可以为你节省很
在我刚刚编写的一个测试解析器中,我遇到了一个奇怪的问题,我不太明白。 将其简化为显示问题的最小示例,让我们从以下语法开始: 这是语法的变化: 突然间,相同的测试输入被错误地分解成两个statement_list,每个statement_list都继续到一个带有“missing”;“警告,第一个返回“z=”的不完整的assignment_statement,第二个返回“x+”的不完整的assignm
问题内容: 我是Go的新手,现在遇到了问题。我有一个称为Message的类型,它是这样的结构: 我也有一个名为CreateMessage的类型,如下所示: 我有一个像的JSON字符串。 当我用来将其解码为Message变量时,答案是。 因此,我可以将JSON解码为Message结构并更改其Data的接口{}以根据Cmd键入CreateMessage吗? 我试图将Data直接转换为CreateMes
我需要解析一个日期,当我解析一个无效的日期“2007年2月29日”时,它将以dd/MM/yyyy的格式返回给我,作为本地日期2007-02-28,代码如下: 但是,如果我使用ISO格式(没有DateTimeFormatter)进行解析,则会出现异常,代码如下: 例外情况: 所以我的问题是,我想考虑一下: 由于无效,我如何使用LocalDate呢。作语法分析
问题内容: 我在Go中使用Sockjs,但是当javascript客户端将json发送到服务器时,它会对其进行转义,并将其作为[]字节发送。我试图弄清楚如何解析json,以便我可以读取数据。但是我得到这个错误。 json:无法将字符串解组为main.Msg类型的Go值 我怎样才能解决这个问题?html.UnescapeString()无效:/ 问题答案: 您可能要先在JSON字符串上使用:) 这是