当前位置: 首页 > 知识库问答 >
问题:

如何在Golang的顶级结构中检索嵌套的json值?

卢俭
2023-03-14

我试图从API调用中检索数据并将其传递给另一个服务。我收到的数据是在一个特定的JSON结构,我想把它映射到一个结构,但没有多层次的数据。我尝试了点符号来访问更深的值,但它不起作用。

基本上,我试图得到一个包含一系列“问题”(key、self、description)的结构,但没有“fields.description”结构。

JSON:

{
  "ticket": {
    "number": "2",
    "issues": [
      {
        "key": "TA-2",
        "self": "http://localhost:8080/rest/api/2/issue/10100",
        "fields": {
          "description": "This template is used to create openshift project.\n|Type|Value|Help|\n|project_name|personal_project|Enter the name of your openshift project|\n|memory|8GB|Enter the desired amount of memory|"
        }
      },
      {
        "key": "TA-1",
        "self": "http://localhost:8080/rest/api/2/issue/10000",
        "fields": {
          "description": "This template is used to create openshift project.\n|Type|Value|Help|\n|project_name|my_openshift_project|Enter the name of your openshift project|\n|memory|4GB|Enter the desired amount of memory|"
        }
      }
    ]
  }
}

结构:

type Todo struct {
  Number string `json:"number"`
  Issue  []struct {
      Key         string `json:"key"`
      Self        string `json:"self"`
      Description string `json:"field.description"` //doesn't work. don't know what to put ...
  } `json:"issues"`
}

预期/期望的结构:

{
  "number": "2",
  "issues": [{
    "key": "TA-2",
    "self": "http://localhost:8080/rest/api/2/issue/10100",
    "description": "This template ..."
  }, {
    "key": "TA-1",
    "self": "http://localhost:8080/rest/api/2/issue/10000",
    "description": "This template ..."
  }]
}

有可能吗?如果是,怎么做?使用嵌套结构不会更改初始JSON结构。

谢啦

共有2个答案

李成礼
2023-03-14

不能在json结构标记中添加点符号。如果您希望在字段下有多个字段,并且如果您确定每个字段值都是字符串,那么您可以将JSON解组为

type Todo struct {
  Number string `json:"number"`
  Issue  []struct {
      Key         string `json:"key"`
      Self        string `json:"self"`
      Fields map[string]string `json:"fields"`
  } `json:"issues"`
}

如果每次只有description

Fields struct {
    Description string `json:"description"`
} `json:"fields"`
路裕
2023-03-14

你至少有三个选择:

  1. 创建一组单独的结构类型,以JSON提供的格式表示数据。这可能包括一个带有ticket字段的TodoList结构,它指的是一个单独的Todo结构。此结构可能有一个number字段和一个issues字段。每个问题结构可能有一个字段字段,该字段又有一个描述字段。基本上,您可以重新创建JSON中表示的整个域,然后只需调用JSON即可。Unmarshal()将JSON解组到TodoList中。一旦你有了一个TodoList,只需将它转换成你想要的手工表达
  2. TodoIssue结构编写自己的自定义UnmarshalJSON()函数。点击此处查看GoLang文档中的示例
  3. 在外部html" target="_blank">函数中手动解组整个JSON文档。这可能涉及将数据解组为map[string]json。RawMessage,然后映射许多json。RawMessage将对象映射到其他贴图和对象,依此类推

第一个选项更适用于以下情况:您只需要对所需的数据进行替代表示,但所有数据仍在JSON文档中,并且JSON文档中的所有数据仍具有相关性。这似乎符合你的困境,所以这是我推荐的选择。

第二种选择更适合于这样的情况,即您只想认识到结构的JSON编码应该提供与GoLang对象编码一致的不同表示。换句话说,当结构被编码为GoLong对象时,它应该采取一种形式,而当结构被编码为JSON时,它应该采取另一种形式。这两个表单必须严格绑定到它们的编码(JSON vs GoLong对象)。如果您计划将JSON解编组到一个GoLong对象,然后将其编组回一个不同的JSON表示,这可能不是最好的选择,因为json。unmarshal()和json。marshal()应该是相互反相的。否则,你就违反了最不惊讶的原则。此选项还可用于通过json延迟或防止对嵌套属性进行解组。RawMessage对象。因此,如果您有一些动态类型的JSON字段,其类型是在检查其他字段时确定的,或者如果您在JSON文档中有大量不相关的数据,您可以延迟或防止这些数据的解组,直到需要。

实际上,第三种选择与第二种非常相似。但是,通过提供外部解组机制,而不是实现解组JSON(),您不太可能违反最小惊讶原则。也就是说,json之间的感知契约。Unmarshal()json。封送处理()必须保留。。因此,您可以按自己的意愿封送和解封送数据,并且可以按自己的意愿维护每个编码的不同表示形式。尽管如此,第一种选择提供了同样的好处,而且更容易。实际上,只有在第一个和第二个选项不足以满足要求的情况下,才应该选择第三个选项,例如当您可能需要延迟或防止对嵌套属性(如第二个选项)进行解组时,同时提供多个不同的JSON表示并保留JSON之间的约定。Marshal()json。Unmarshal()(与第一个选项类似)。

 类似资料:
  • 问题内容: 团队,编程新手。如下图所示对Json进行编组后,我有可用数据,该数据具有嵌套的Key值。我可以访问的固定键值,如何访问嵌套键值。拆封后,这是下面显示的字节切片数据—> 我可以使用以下代码访问平面键值 这是完整的功能 问题答案: 注意:这可能不适用于您的JSON结构。我根据您的问题推断出它将是什么,但是如果没有实际的结构,我无法保证它可以在不做任何修改的情况下工作。 如果要在映射中访问它

  • 问题内容: 我有要解析的JSON文件。JSON文件(“ myfile”)的格式如下: 我想从语言级别检索键2的值(ŚrednioZaawansowany)。 接下来做什么?我如何迭代呢? 问题答案: 也许您没有使用Java库的最新版本的JSON。 已有很长时间没有更新,而2个月前已更新。 可以在GitHub上找到,这是其仓库的链接:https : //github.com/douglascrock

  • 问题内容: http://play.golang.org/p/f6ilWnWTjm 我正在尝试解码以下字符串,但仅获取空值。 如何在Go中解码嵌套的JSON结构? 我想将以下内容转换为地图数据结构。 问题答案: 在Go中使用嵌套结构来匹配JSON中的嵌套结构。 这是一个如何处理示例JSON的示例: 游乐场链接 您还可以对内部结构使用匿名类型: 游乐场链接 或外部和内部结构: 游乐场链接 如果您不知

  • 下面是一个Java程序,我正在尝试使用org.fasterxml.jackson.core和jackson-databind库以流式方式测试JSON处理。 目标是学习如何处理JSON并捕获我想要的信息。现在,我想要完成的是以下内容: 1)我在这里发布的JSON有很多数据。跟随这个JSON的Java程序是我试图处理这个JSON,特别是,捕获“Part1/MyAnalysis/Matches”下的“n

  • 问题内容: 我知道如何在同一包中的结构中嵌入其他结构,但是如何在其他包的结构中嵌入结构? dog.go main.go 当我运行main.go时,它告诉我一个错误: 问题答案: @simon_xia是正确的,看来您 可能 对Go有点陌生。 首先,欢迎来到社区!! 现在,请扩展一下他的评论… Go并未提供成员/方法的公共/私有范围,而是具有Exporting的概念。因此,如果要允许从另一个包访问方法

  • 问题内容: 嗨,我在解组嵌套的JSON数组时遇到问题。我应该创建什么结构?我想避免使用尽可能多的东西,但是我真的不知道在这种情况下是否有可能。 杰森,我想解组: 和我想用来解组的结构: 链接到示例:https : //play.golang.org/p/owuMptNrix 问题答案: 是的,答案只是一小部分: 好感谢你的问题,我发现这个错误的工具,我总是用它的Json操作一起去,它可以为你节省很