json - 请帮我弄清楚如何解析这个json文件

标签 json parsing go

关闭。这个问题需要details or clarity .它目前不接受答案。












想改进这个问题?通过 editing this post 添加详细信息并澄清问题.

2年前关闭。




Improve this question




我刚开始学围棋。

这是我需要解析的文件:

{ 
    "people": {
        "asd": {
            "name": "Alex",
            "id": 0,
            "s": "m"
        },
        "fda": {
            "name": "Mike",
            "id": 1,
            "s": "m"
        },
        "fg2": {
            "name": "Rosa",
            "id": 3,
            "s": "f",
            "Childs" :
            [
                {
                    "name": "Bob",
                    "age": 1,
                    "s": "m"
                },
                {
                    "name": "Maria",
                    "age": 2,
                    "s": "f"
                }
            ]
        }
    }
}

asd、fda、fg2 是由一组随机字符组成的某种标识符。

首先,我无法描述这个文件的结构,我被这些随机标识符弄糊涂了。

我这样做了:
type people {
    People *map[string]interface{} `json:"people"`
}

所以我试图读取和解析这个文件并且卡住了。
这是我的代码:
package main

import "encoding/json"
import "io/ioutil"
import "log"
import "fmt"

type people struct {
    People map[string]interface{} `json:"people"`
}

func main() {

    file, err := ioutil.ReadFile("./people.json")
    if err != nil {
        log.Println("error:", err)
    }

    var data people

    err = json.Unmarshal([]byte(file), &data)
    if err != nil {
        log.Println("error:", err)
    }

    //fmt.Println(data.people)//

    fmt.Println(data)
    //  for i := 0; i < len(data); i++ {//here the compiler throws error...
    //    fmt.Println("name: ", data[i].name)//#@!o_0
    //  }
  }

错误是:无效操作:data[i](类型 people 不支持索引)。

请帮我整理和打印这些人的名字,以及他们 child 的名字。
Alex
Mike
Rosa
    Bob
    Maria

最佳答案

使用 json.Decoder 可能是最简单的。您还需要记住,在使用不同键(例如您的示例中的“asd”、“fda”、“fg2”)解码 JSON 映射时,您应该使用映射,但对于固定键(“name”、“id”、 “年龄”)你应该使用结构。

这里有一些代码来说明Go Playground :

package main

import (
    "encoding/json"
    "fmt"
    "strings"
)

type people struct {
    People map[string]Person `json:"people"`
}

type Person struct {
    Name     string   `json:"name"`
    ID       int      `json:"id,omitempty"`
    Sex      string   `json:"s,omitempty"`
    Age      int      `json:"age,omitempty"`
    Children []Person `json:"Childs,omitempty"`
}

func main() {
    file, err := ioutil.ReadFile("./people.json")
    if err != nil {
        log.Fatalln("error:", err)
    }

    var data people
    if err := json.NewDecoder(strings.NewReader(string(file))).Decode(&data); err == nil {
        fmt.Println(data)
    }
}

关于json - 请帮我弄清楚如何解析这个json文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61601436/

相关文章:

json - 在 Golang 中将 TXT 文件转换为 Json

parsing - 使用 ANTLR 进行 DSL 的代码替换

c++ - Boost 跳过解析器是正确的方法吗?

java - 将电话号码(手机或固定电话)拆分为国家代码、区号和号码

json - 如何在网站页面上显示 Shopify 购物车值(Shopify 网站之外)

PHP:从数据库获取查询结果并将其编码为 JSON 数组并传递给 Android

javascript - 在我的 Google 搜索 API 调用中,它返回一个有效的 JSON,但每当我解析它以获取特定值时,我都会得到 Undefined

Goroutine执行顺序

arrays - 去模板绑定(bind)常量数组值

用于通过 RPC 传递匿名函数的 GobEncoder