当第一级是数组时,如何用go-simplejson处理

vwoqyblh  于 2023-01-15  发布在  Go
关注(0)|答案(3)|浏览(197)

JSON结构如下所示:

[
  {
    "sha": "eb08dc1940e073a5c40d8b53a5fd58760fde8f27",
    "node_id": "C_kwDOHb9FrtoAKGViMDhkYzE5NDBlMDczYTVjNDBkOGI1M2E1ZmQ1ODc2MGZkZThmMjc",
    "commit": {
      "author": {
        "name": "xxxx"
      },
      "committer": {
        "name": "xxxxx"
      },
      "message": "update DownLoad_Stitch_ACM.py",
      "tree": {
        "sha": "a30aab98319846f0e86da4a39ec05786e04c0a4f",
        "url": "xxxxx"
      },
      "url": "xxxxx",
      "comment_count": 0,
      "verification": {
        "verified": false,
        "reason": "unsigned",
        "signature": null,
        "payload": null
      }
    },
    "url": "xxxxx",
    "html_url": "xxxxx",
    "comments_url": "xxxxx",
    "author": {
      "login": "xxxxx",
      "id": "xxxxx",
      "node_id": "U_kgDOBkuicQ",
      "avatar_url": "https://avatars.githubusercontent.com/u/105620081?v=4",
      "gravatar_id": "",
      "type": "User",
      "site_admin": false
    },
    "committer": {
      "login": "xxxxx",
      "id": "xxxxx"
    },
    "parents": [
      {
        "sha": "cf867ec9dc4b904c466d9ad4b9338616d1213a06",
        "url": "xxxxx",
        "html_url": "xxxxx"
      }
    ]
  }
]

我不知道如何获取位置0的数据。

content, _ := simplejson.NewJson(body)
arr, _ := content.Array()  // Here can get the all data, It's []interface{} type.

arr[0]["sha"]取不到下一个数据,怎么处理?

elcex8rz

elcex8rz1#

编译器在编译时并不清楚arrmap[string]interface{}的数组,因为arr[0]interface{}类型,这基本上意味着编译器对这种类型一无所知,这就是为什么不能在这里进行Map查找操作。
您可以添加一个类型Assert,以确保可以将其用作Map,如下所示:

asMap := arr[0].(map[string]interface{})
fmt.Println(asMap["sha"])

要获得字符串形式的SHA,还可以在其后面添加一个类型Assert:

asString := asMap["sha"].(string)

这个例子也显示了这一点,缺点是如果给定的数据不是指定的类型,程序就会崩溃,你可以使用类型Assert来检查它是否有效(asString, ok := ...),但是对于更复杂的数据,它会变得很麻烦。
这样做是可行的,但不是很好,我建议使用tool like this来生成Go语言的结构体,然后以类型安全的方式使用它们,首先定义一个结构体,包含你需要的所有信息:

type ArrayElement struct {
    Sha string `json:"sha"`
    // Add more fields if you need them
}

然后,您可以使用标准库json包来解组您的数据:

// This should have the same structure as the data you want to parse
var result []ArrayElement

err := json.Unmarshal([]byte(str), &result)
if err != nil {
    panic(err)
}

fmt.Println(result[0].Sha)

这里有一个例子--这是一种更像Go语言的JSON数据转换方法。

jgovgodb

jgovgodb2#

您的json数据格式不对,首先删除"id": "xxxxx",行后的,

...
    "id": "xxxxx"
    ...

您应该在NewJson之后检查错误,以防止发现是否存在问题:

content, err := simplejson.NewJson(body)
    if err != nil {
        // log err
    }

要从第一个索引中获取sha,可以简单地使用simplejson内置方法:

shaVal := content.GetIndex(0).Get("sha").String()
mwkjh3gx

mwkjh3gx3#

以下是您可以获得所需值的方法。
这对我很有效。

package main

import (
    "encoding/json"
    "fmt"
)

type MyData []struct {
    Sha    string `json:"sha"`
    NodeID string `json:"node_id"`
    Commit struct {
        Author struct {
            Name string `json:"name"`
        } `json:"author"`
        Committer struct {
            Name string `json:"name"`
        } `json:"committer"`
        Message string `json:"message"`
        Tree    struct {
            Sha string `json:"sha"`
            URL string `json:"url"`
        } `json:"tree"`
        URL          string `json:"url"`
        CommentCount int    `json:"comment_count"`
        Verification struct {
            Verified  bool        `json:"verified"`
            Reason    string      `json:"reason"`
            Signature interface{} `json:"signature"`
            Payload   interface{} `json:"payload"`
        } `json:"verification"`
    } `json:"commit"`
    URL         string `json:"url"`
    HTMLURL     string `json:"html_url"`
    CommentsURL string `json:"comments_url"`
    Author      struct {
        Login      string `json:"login"`
        ID         string `json:"id"`
        NodeID     string `json:"node_id"`
        AvatarURL  string `json:"avatar_url"`
        GravatarID string `json:"gravatar_id"`
        Type       string `json:"type"`
        SiteAdmin  bool   `json:"site_admin"`
    } `json:"author"`
    Committer struct {
        Login string `json:"login"`
        ID    string `json:"id"`
    } `json:"committer"`
    Parents []struct {
        Sha     string `json:"sha"`
        URL     string `json:"url"`
        HTMLURL string `json:"html_url"`
    } `json:"parents"`
}

func main() {

    my_json_data := `[
  {
    "sha": "eb08dc1940e073a5c40d8b53a5fd58760fde8f27",
    "node_id": "C_kwDOHb9FrtoAKGViMDhkYzE5NDBlMDczYTVjNDBkOGI1M2E1ZmQ1ODc2MGZkZThmMjc",
    "commit": {
      "author": {
        "name": "xxxx"
      },
      "committer": {
        "name": "xxxxx"
      },
      "message": "update DownLoad_Stitch_ACM.py",
      "tree": {
        "sha": "a30aab98319846f0e86da4a39ec05786e04c0a4f",
        "url": "xxxxx"
      },
      "url": "xxxxx",
      "comment_count": 0,
      "verification": {
        "verified": false,
        "reason": "unsigned",
        "signature": null,
        "payload": null
      }
    },
    "url": "xxxxx",
    "html_url": "xxxxx",
    "comments_url": "xxxxx",
    "author": {
      "login": "xxxxx",
      "id": "xxxxx",
      "node_id": "U_kgDOBkuicQ",
      "avatar_url": "https://avatars.githubusercontent.com/u/105620081?v=4",
      "gravatar_id": "",
      "type": "User",
      "site_admin": false
    },
    "committer": {
      "login": "xxxxx",
      "id": "xxxxx"
    },
    "parents": [
      {
        "sha": "cf867ec9dc4b904c466d9ad4b9338616d1213a06",
        "url": "xxxxx",
        "html_url": "xxxxx"
      }
    ]
  }]`

    var data MyData
    err := json.Unmarshal([]byte(my_json_data), &data)
    if err != nil {
        panic(err)
    }

    fmt.Println("data --> sha: ", data[0].Sha)
}

相关问题