如何在golang中的json数组中替换/更新键值?

时间:2019-01-21 13:22:19

标签: json go range

我有一个json数组,其中包含一些标志作为键,并且我将这些键的默认值设置为false。这是我的json数组。

var flags = map[string]bool{
    "terminationFlag":  false,
    "transferFlag":   false,
    "jrCancelledFlag": false,
    "jrFilledFlag":  false,
}

在for循环中执行操作时,我必须将上述json数组中的1字段更新为true。在下一次迭代期间,它必须将json数组中的第二个字段更新为true。将json数组中的所有字段都设置为true后,我必须返回json数组。

我尝试的代码:

  Keystrings := []string{"terminationReport - 2019-1","transferReport - 2019-1","jrCancelledReport - 2019-1","jrFilledReport - 2019-1"}
  fmt.Println("Keystrings ", Keystrings)

  for i,value := range Keystrings {     
    bytesread, err = stub.GetState(value)
    var result []string
    _ = json.Unmarshal(bytesread, &result)
    fmt.Println("result ", result)
    if result[0] == "yes"{
        fmt.Println("result in if ", result)
       flags[i] = true
    }
}

2 个答案:

答案 0 :(得分:0)

由于很难从问题中了解所要询问的内容,因此这里是尝试使用类似数据作为问题的一种简单尝试,希望您可以从该样本中获取正确的内容,并将其适应您的问题。遵循代码中的注释以了解发生了什么。

package main

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

var jsonBlob = []byte(`["jrCancelledFlag", "yes"]`)

var flags = map[string]bool{
    "terminationFlag": false,
    "transferFlag":    false,
    "jrCancelledFlag": false,
    "jrFilledFlag":    false,
}

func main() {
    // Parse jsonBlob into a slice of strings
    var parsed []string
    if err := json.Unmarshal(jsonBlob, &parsed); err != nil {
        log.Fatalf("JSON unmarshal: %s", err)
    }

    // Expect the slice to be of length 2, first item flag name, second item
    // yes/no.
    if len(parsed) != 2 {
        log.Fatalf("parsed len %d, expected 2", len(parsed))
    }

    // Assume parsed[0] actually appears in flags... otherwise more error checking
    // is needed.
    if parsed[1] == "yes" {
        flags[parsed[0]] = true
    }

    // Emit updated flags as json
    json, err := json.Marshal(flags)
    if err != nil {
        log.Fatalf("JSON marshal: %s", err)
    }
    fmt.Println(string(json))
}

答案 1 :(得分:0)

这可以通过使用JSON接口定义自己的解组器来实现清理

https://medium.com/@nate510/dynamic-json-umarshalling-in-go-88095561d6a0

package main

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

var jsonBlob = []byte(`["jrCancelledFlag", "yes"]`)

// Flags ...
type Flags struct {
    TerminationFlag bool `json:"terminationFlag,omitempty"`
    TransferFlag    bool `json:"transferFlag,omitempty"`
    JRCancelledFlag bool `json:"jrCancelledFlag,omitempty"`
    JRFilledFlag    bool `json:"jrFilledFlag,omitempty"`
}

// UnmarshalJSON satisfies the JSON unmarshaller interface
func (f *Flags) UnmarshalJSON(data []byte) error {
    var parsed []string
    if err := json.Unmarshal(jsonBlob, &parsed); err != nil {
        return err
    }
    if len(parsed)%2 != 0 {
        return fmt.Errorf("expected string to be evenly paired")
    }

    for i := 0; i < len(parsed); i++ {
        j := i + 1
        if j < len(parsed) {
            switch parsed[i] {
            case "terminationFlag":
                f.TerminationFlag = toBool(parsed[j])
            case "transferFlag":
                f.TransferFlag = toBool(parsed[j])
            case "jrCancelledFlag":
                f.JRCancelledFlag = toBool(parsed[j])
            case "jrFilledFlag":
                f.JRFilledFlag = toBool(parsed[j])
            }
        }
    }
    return nil
}

func toBool(s string) bool {
    if s == "yes" {
        return true
    }
    return false
}

func main() {

    var flags Flags
    err := json.Unmarshal(jsonBlob, &flags)
    if err != nil {
        log.Fatal(err)
    }

    b, _ := json.Marshal(flags)
    fmt.Println(string(b))
}