golang如何解析这类格式

我有一堆体积很大的文件需要处理,每个文件就是一个大的map结构.结构如下:

{"1377180137": {"product1": {"subsys1": {"module1": {"service1": {"num": 24465 ,"sum": 4339,"min": 0},"member": {"num": 24465 ,"sum": 2909,"min": 0}},"module2":{"service2":{"num": 24465 ,"sum": 4339,"min": 0}}},"subsys2":{….}

特点:

  1. 每一层的key内容是变化的,但他们是固定的第一层为时间,依次是产品,子系统,模块,服务,再是服务具体的num sum min 这些key是固定的.
  2. 我需要重新提取这些数据如同服务的值进行相加等.

我原本是想通过for k,v range 的方式来层层解析,但是因为go语言的类型严格区分,没有办法简单的进行,加上我对这些类型的转换不是很清楚;

后来又想通过json来解析,但json的key是固定的,好像也没有办法直接进行.

谢谢.

阅读 10.1k
6 个回答
{
  "1377180137": {
    "product1": {
      "subsys1": {
        "module1": {
          "service1": {
            "num": 24465,
            "sum": 4339,
            "min": 0
          },
          "member": {
            "num": 24465,
            "sum": 2909,
            "min": 0
          }
        },
        "module2": {
          "service2": {
            "num": 24465,
            "sum": 4339,
            "min": 0
          }
        }
      }
    }
  }
}

JSON 有问题,直接 encode/json 包即可

直接用Unmarshal传入interface就好了

后面的你在遍历解析就行了

package main
import (
    "fmt"
    "encoding/json"
)


func main() {
    msg := "{\"1377180137\":{\"product1\":{\"subsys1\":{\"module1\":{\"service1\":{\"num\": 
24465,\"sum\":4339,\"min\":0},\"member\":{\"num\":24465,\"sum\":2909,\"min\":0}},           
\"module2\":{\"service2\":{\"num\":24465,\"sum\":4339,\"min\":0}}},\"subsys2\":{\"module3\":
{\"service3\":{\"num\":24465,\"sum\":4339,\"min\":0},\"member\":{\"num\":24465,\"sum\":2909,
\"min\":0}},\"module4\":{\"service4\":{\"num\":24465,\"sum\":4339,\"min\":0}}}}}}"  
    var  redu  interface{}
    err := json.Unmarshal([]byte(msg), &redu)
    if err != nil {
        fmt.Println("ERROR:", err) 
        return
    }       
    fmt.Println(redu)

}  

运算结果

map[1377180137:map[product1:map[subsys2:map[module4:map[service4:map[sum:4339 min:0 num:24465]] module3:map[member:map[sum:2909 min:0 num:24465] service3:map[sum:4339 min:0 num:24465]]] subsys1:map[module2:map[service2:map[num:24465 min:0 sum:4339]] module1:map[service1:map[min:0 sum:4339 num:24465] member:map[num:24465 sum:2909 min:0]]]]]]

我觉得你想要的是如何规划一个struct,可以符合层层变化的json格式。

按你所说,最里层的service结构是固定的,所以可以将其定义出来:

type Service struct {
    Num int `json:"num"`
    Sum int `json:"sum"`
    Min int `json:"min"`
}

再向外层是module:

type Module map[string]Service

再外层是subsys:

type Subsys map[string]Module

依次定义到最外层

type Product map[string]Subsys
type Products map[string]Product

然后解析的时候把json text直接unmarshal到一个Products的变量里,之后再对其结果进行处理。

不知道这样是不是能解决你的疑问。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏