当前位置: 首页 > 面试题库 >

如何将具有相同内部结构的两个json解组为一个单独的golang结构?

李文轩
2023-03-14
问题内容

我有两个具有以下结构的json文件

{
 "cast": [
        {
            "url": "carey-mulligan",
            "name": "Carey Mulligan",
            "role": "Actress"
        },
        {
            "url": "leonardo-dicaprio",
            "name": "Leonardo DiCaprio",
            "role": "Actor"
        },
        .
        .
        .
         ]
}

{
 "movie": [
        {
            "url": "carey-mulligan",
            "name": "Carey Mulligan",
            "role": "Actress"
        },
        {
            "url": "leonardo-dicaprio",
            "name": "Leonardo DiCaprio",
            "role": "Actor"
        },
        .
        .
        .
         ]
}

如您所见,json和演员表的内部结构相同。我想将这些json文件解编为相同的golang结构。但是我不能为相同的struct元素提供两个名称标签(广播和电影)。我想要类似的东西

type Detail struct {
    Name string `json:"name"`
    Url  string `json:"url"`
    Role string `json:"role"`
}

type Info struct {
    Detail []Detail `json:"cast or movie"`
}

在这种情况下,Detail可以同时解析演员和电影。

这是我当前的代码

// RIMAGE project main.go
package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
)

const (
    website = "https://data.moviebuff.com/"
)

func main() {
    fmt.Println("Hello World!")
    content, err := ioutil.ReadFile("data/great-getsby")
    if err != nil {
        panic(err)
    }

    var info Info

    err = json.Unmarshal(content, &info)
    if err != nil {
        panic(err)
    }

    fmt.Println(info.Detail)
}

type Detail struct {
    Name string `json:"name"`
    Url  string `json:"url"`
    Role string `json:"role"`
}

type Info struct {
    Detail []Detail `json:"cast" json:"movie"
}

但它仅适用于第一个标签“ cast”,并在json包含电影的情况下给出nill。

提前致谢。


问题答案:

您可以使用type Info map[string][]Detail而不是您的结构。试一下[Go playground](https://play.golang.org/p/P-Ge6wjXRk)

或者,您可以在结构中使用这两种类型,然后使用make方法Details()返回正确的一种:

type Info struct {
    CastDetails  []Detail `json:"cast"`
    MovieDetails []Detail `json:"movie"`
}

func (i Info) Details() []Detail {
    if i.CastDetails == nil {
        return i.MovieDetails
    }
    return i.CastDetails
}

试一下 [Go playground](https://play.golang.org/p/eYf7c-w_4e)



 类似资料:
  • 问题内容: 假设以下xml元素具有属性和浮点值: 为了解组它,我应该如何定义我的结构? XMLName属性的用法使我感到困惑。什么时候应该将其放置在结构中,何时将其作为标签包装? 问题答案: 在下面,您可以找到解组给定数据的代码。 在删除空格之前,无法正确解组浮点值。 可以使用“,chardata”注释引用标记的内容。 您无需在结构中指定字段,只要它不模糊应使用哪种结构即可。

  • 问题内容: 我是初学者,尝试解组以下json字符串 这是结构 这是功能 该函数正在返回 问题答案: 您的JSON输入不是的一部分,因为还有另一个JSON对象包装器,并且值属于属性。 更深入地讲,是一个JSON数组,其中的对象持有不同的键,其值可由表示。 因此,要完全描述您的JSON,您需要某种“动态”类型。例如,地图就是这种动态类型。 因此,您的原始JSON输入可以使用类型完全建模。这是一张地图,

  • 我是go初学者,正在尝试解组下面的json字符串 下面是这个结构 这是函数 函数正在返回

  • 问题内容: 我想解析一个json文件,但它经过这样的事情: 但是大约有三千个这样的对象。我一直在使用Gson解析我的json对象,但是我怎么解析这种文件呢?以及如何检索名称“ CDG”或“ ORY”? 问题答案: 您可以尝试如下操作: 使用gson,您可以按以下方式检索键名: 并使用java- json 可以执行以下操作: 从网址获取json:

  • 问题内容: 如果我的猜测正确的话,我可能会遇到结构问题,可能还会遇到指针问题。 该结构具有一些字段和一个包含切片的字段: 这看起来是这样的: 我的问题是将的值更改为。 有一个监听连接的方法: 并且是无法正常工作的部分,该方法如下所示: 这实际上被执行了,所以连接没有得到响应或其他问题不是问题。 但是,如果以后尝试使用的方法来遍历它,则总是出于某种原因(默认设置)。 我想我正在使用的是原始连接的副本

  • 问题内容: 我有两个成员相同,我想将一个结构复制到另一个结构,请参见下面的伪代码: 然后,我有结构的,而结构的,有什么办法复制的? 问题答案: 使用转换更改类型。以下代码使用转换将type 的值复制到type 的值: 游乐场的例子 该转换仅在基础类型,除了结构标签相同的工作。