트리 - Go에서 동적이거나 알려지지 않은 JSON/YAML을 처리하기 위한 간단한 구조

18058 단어 goyamljson

소개



Go는 표준 map[string]interface{} 등을 사용하여 동적 json/yaml을 구문 분석할 수 있습니다. 그러나 중첩된 인터페이스{}는 보기 흉한 코드를 생성하는 경향이 있습니다.

Tree은 이 문제에 대한 한 가지 해결책입니다.

특징


  • 유창한 인터페이스가 있는 노드에 도달하기 위해 알 수 없는 구조의 json/yaml을 구문 분석합니다.
  • Go 표준 및 맵 및 슬라이스와 유사한 구문입니다.
  • 찾기 기능을 쿼리 식으로 지정할 수 있습니다.
  • 편집 기능을 편집 식으로 지정할 수 있습니다.
  • 번들로 제공되는 'tq'는 이식 가능한 명령줄 JSON/YAML 프로세서입니다.

  • Go의 예



    마샬링 및 언마샬링




    func ExampleMarshalJSON() {
        group := tree.Map{
            "ID":     tree.ToValue(1),
            "Name":   tree.ToValue("Reds"),
            "Colors": tree.ToArrayValues("Crimson", "Red", "Ruby", "Maroon"),
        }
        b, err := json.Marshal(group)
        if err != nil {
            log.Fatal(err)
        }
        fmt.Println(string(b))
    
        // Output:
        // {"Colors":["Crimson","Red","Ruby","Maroon"],"ID":1,"Name":"Reds"}
    }
    



    func ExampleUnmarshalJSON() {
        data := []byte(`[
      {"Name": "Platypus", "Order": "Monotremata"},
      {"Name": "Quoll",    "Order": "Dasyuromorphia"}
    ]`)
    
        var animals tree.Array
        err := json.Unmarshal(data, &animals)
        if err != nil {
            log.Fatal(err)
        }
        fmt.Printf("%+v\n", animals)
    
        // Output:
        // [map[Name:Platypus Order:Monotremata] map[Name:Quoll Order:Dasyuromorphia]]
    }
    


    얻다




    func ExampleGet() {
        group := tree.Map{
            "ID":     tree.ToValue(1),
            "Name":   tree.ToValue("Reds"),
            "Colors": tree.ToArrayValues("Crimson", "Red", "Ruby", "Maroon"),
            "Nil":    nil,
        }
        fmt.Println(group.Get("Colors").Get(1))
        fmt.Println(group.Get("Colors", 2))
        fmt.Println(group.Get("Colors").Get(5).IsNil())
        fmt.Println(group.Get("Nil").IsNil())
    
        // Output:
        // Red
        // Ruby
        // true
        // true
    }
    


    찾다




    func ExampleFind() {
        group := tree.Map{
            "ID":     tree.ToValue(1),
            "Name":   tree.ToValue("Reds"),
            "Colors": tree.ToArrayValues("Crimson", "Red", "Ruby", "Maroon"),
        }
    
        rs, err := group.Find(".Colors[1:3]")
        if err != nil {
            log.Fatal(err)
        }
        for _, r := range rs {
            fmt.Println(r)
        }
    
        // Output:
        // Red
        // Ruby
    }
    


    편집하다




    func ExampleEdit() {
        var group tree.Node = tree.Map{
            "ID":     tree.ToValue(1),
            "Name":   tree.ToValue("Reds"),
            "Colors": tree.ToArrayValues("Crimson", "Red", "Ruby", "Maroon"),
        }
    
        if err := tree.Edit(&group, ".Colors += \"Pink\""); err != nil {
            log.Fatal(err)
        }
        fmt.Printf("Append Pink to Colors:\n  %+v\n", group)
    
        if err := tree.Edit(&group, ".Name = \"Blue\""); err != nil {
            log.Fatal(err)
        }
        fmt.Printf("Set Blue to Name:\n  %+v\n", group)
    
        if err := tree.Edit(&group, ".Colors ^?"); err != nil {
            log.Fatal(err)
        }
        fmt.Printf("Delete Colors:\n  %+v\n", group)
    
        // Output:
        // Append Pink to Colors:
        //   map[Colors:[Crimson Red Ruby Maroon Pink] ID:1 Name:Reds]
        // Set Blue to Name:
        //   map[Colors:[Crimson Red Ruby Maroon Pink] ID:1 Name:Blue]
        // Delete Colors:
        //   map[ID:1 Name:Blue]
    }
    


    tq



    tq는 이식 가능한 명령줄 JSON/YAML 프로세서입니다. 자세한 내용은 jarxorg/tree을 참조하십시오.

    용법




    tq is a command-line JSON/YAML processor.
    
    Usage:
      tq [flags] [query] ([file...])
    
    Flags:
      -e, --edit stringArray       edit expression
      -x, --expand                 expand results
      -h, --help                   help for tq
      -U, --inplace                update files, inplace
      -i, --input-format string    input format (json or yaml)
      -O, --output string          output file
      -o, --output-format string   output format (json or yaml, default json)
      -r, --raw                    output raw strings
      -s, --slurp                  slurp all results into an array
      -t, --template string        golang text/template string
      -v, --version                print version
    
    Examples:
      % echo '{"colors": ["red", "green", "blue"]}' | tq '.colors[0]'
      "red"
    
      % echo '{"users":[{"id":1,"name":"one"},{"id":2,"name":"two"}]}' | tq -x -t '{{.id}}: {{.name}}' '.users'
      1: one
      2: two
    
      % echo '{}' | tq -e '.colors = ["red", "green"]' -e '.colors += "blue"' .
      {
        "colors": [
          "red",
          "green",
          "blue"
        ]
      }
    

    좋은 웹페이지 즐겨찾기