json - 我如何在 Go 中解析 JSON?

标签 json go

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/

相关文章:

javascript - 从动态表单生成创建 JSON

go - 当某些成员 protected /内部/隐藏时如何编码结构

testing - 如何在 HTML 覆盖率报告中包含 *_test.go 文件

go - 为什么 "go vet"这里不显示错误呢?

go - 直接在 Go 中创建或使用 GPG 或 SSH key

go - 在 Docker for Go 程序中构建 Docker

json - Golang net/http 请求 Body 总是空的

jquery - 标题中带有特殊字符的 $.getJson 函数

python - 如何将 YANG 数据模型转换为 JSON 数据?

json - 为什么我在此 cURL 调用中的请求正文中收到格式错误的 JSON?