JSON
{
"id" : "12387",
"inv" :[
{
"qty" : 5,
"seq" : 2,
"invIs" : "1HG9876",
"addCharges" :[
{
"amnt" : 24,
"char" : "REI",
"type" : "MT"
},
{
"amnt" : 24,
"char" : "REI",
"type" : "MT"
}
],
"seq" : 3
},
{
"qty" : 5,
"seq" : 2,
"invIs" : "1HG9876",
"addCharges" :[
{
"amnt" : 24,
"char" : "REI",
"type" : "MT"
},
{
"amnt" : 24,
"char" : "REI",
"type" : "MT"
}
],
"seq" : 3
}
],
"charges" : {
"fee" : 24 ,
"bkg" : 7676
}
}
我的 JSON 结构如上所示。我需要在 inv-addCharges
中服用 amnt
在一个数组中。如果它在数组中有 10 个元素,我需要在一个包含特定 amnt
的数组中以这样的方式单独获取它
[{"amnt" : 34 } ,{"amnt" : 34} .... so on ]
我尝试过的事情:
var j map[string]interface{}
err := json.Unmarshal([]byte(ticket), &j)
if err != nil {
panic(err)
}
// Pull out the parents object
bytInv := j["inv"].([]interface{})
// // Print out mother and father
fmt.Println(bytInv)
输出
[map[qty:5 seq:3 invIs:1HG9876 addCharges:[map[amnt:24 char:REI type:MT] map[amnt:24 char:REI type:MT]]] map[qty:5 seq:3 invIs:1HG9876 addCharges:[map[amnt:24 char:REI type:MT] map[amnt:24 char:REI type:MT]]]]
此后,我无法继续进行。
注意:我不想使用结构,因为我有很多 JSON 结构。这就是我的要求。
最佳答案
要求与否,我真的不明白你为什么坚持不为此使用结构。 您能否详细说明为什么会这样?
正如下面的示例程序所证明的那样,如果您只是将数据表示为正确类型的结构,那么该解决方案更容易理解和推理。您可以在 Go playground 上运行它看看它的实际效果。
您的 JSON 数据中有一部分让我感到困惑。每个 Item 节点包含两次 seq
字段。两者具有不同的值(value)。无论您使用哪种方式来解释数据,其中一个字段都会丢失。根据解码器的实现,它将忽略第二个字段,或者用第二个值覆盖第一个字段。这是您的数据生成方式中的错误。
package main
import (
"encoding/json"
"fmt"
"os"
)
func main() {
charges, err := findCharges()
if err != nil {
fmt.Fprintf(os.Stderr, "%v\n", err)
os.Exit(1)
}
for _, c := range charges {
fmt.Printf("%+v\n", c)
}
}
// findCharges locates all 'AddCharge` instances and returns them in a slice.
func findCharges() ([]AddCharge, error) {
var prod Product
data := []byte(jsonString)
err := json.Unmarshal(data, &prod)
if err != nil {
return nil, err
}
var charges []AddCharge
for _, item := range prod.Items {
charges = append(charges, item.AddCharges...)
}
return charges, nil
}
type Product struct {
Id string `json:"id"`
Items []Item `json:"inv"`
}
type Item struct {
Quantity int `json:"qty"`
Sequence int `json:"seq"`
Inventory string `json:"invIs"`
AddCharges []AddCharge `json:"addCharges"`
Charges []Charge `json:"charges"`
}
type Charge struct {
Fee int `json:"fee"`
Bkg int `json:"bkg"`
}
type AddCharge struct {
Amount int `json:"amnt"`
Char string `json:"char"`
Type string `json:"type"`
}
const jsonString = `{
"id" : "12387",
"inv" :[
{
"qty" : 5,
"seq" : 2,
"invIs" : "1HG9876",
"addCharges" :[
{
"amnt" : 24,
"char" : "REI",
"type" : "MT"
},
{
"amnt" : 12,
"char" : "REI",
"type" : "MT"
}
],
"seq" : 3
},
{
"qty" : 5,
"seq" : 2,
"invIs" : "1HG9876",
"addCharges" :[
{
"amnt" : 64,
"char" : "REI",
"type" : "MT"
},
{
"amnt" : 36,
"char" : "REI",
"type" : "MT"
}
],
"seq" : 3
}
],
"charges" : {
"fee" : 24 ,
"bkg" : 7676
}
}`
编辑:如果您确实对addCharges
数据感兴趣,您可以从结构中省略所有不需要的字段。解码器将简单地忽略结构没有定义字段的数据。
关于json - 我如何在 Go 中解析 JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22093103/