我试图从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结构。
谢啦
不能在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"`
你至少有三个选择:
ticket
字段的TodoList
结构,它指的是一个单独的Todo
结构。此结构可能有一个number
字段和一个issues
字段。每个问题
结构可能有一个字段
字段,该字段又有一个描述
字段。基本上,您可以重新创建JSON中表示的整个域,然后只需调用JSON即可。Unmarshal()
将JSON解组到TodoList
中。一旦你有了一个TodoList
,只需将它转换成你想要的手工表达
Todo
和Issue
结构编写自己的自定义UnmarshalJSON()
函数。点击此处查看GoLang文档中的示例
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操作一起去,它可以为你节省很