【问题标题】:How to write all decoded data in a JSON file?如何将所有解码数据写入 JSON 文件?
【发布时间】:2019-09-22 03:12:50
【问题描述】:

我尝试将 XML 数据解析为 JSON 文件,但是当我开始将封送处理的数据写入 JSON 时,它只是重写了 JSON 文件中的数据,因此我得到了包含最后一个 XML 元素的文件。如何将整个数据写入 JSON 文件?

解析 XML 并将数据编组为 JSON 的代码片段

    decoder := xml.NewDecoder(file)
    resultData := map[string]map[string]string{}
    for {
        t, _ := decoder.Token()
        if t == nil {
            break
        }

        switch et := t.(type) {
        case xml.StartElement:
            if et.Name.Local == "profile" {
                var object XMLProfile
                decoder.DecodeElement(&object, &et)

                resultData = map[string]map[string]string{
                    object.ProfileName: {},
                }

                for _, val := range object.Fields {
                    resultData[object.ProfileName][val.Name] = val.Value
                }
            }
        }
    }

    if out, err := json.MarshalIndent(resultData, "", "\t"); err != nil {
        panic(err)
    } else {
        _ = ioutil.WriteFile("test.json", out, 0644)
    }

期待 JSON:

{
  "Profile 1": {
      "role": "user"
  },

  "Profile 2": {
      "role": "user"
  },

  "Profile 3": {
      "role": "admin"
  }
}

实际 JSON:

{
  "Profile 3": {
    "role": "admin"
  }
}

【问题讨论】:

  • 在循环之后写入文件一次,而不是针对每个元素。
  • @peter 相同的输出。我认为问题出在 resultData 中,但我不知道如何解决它
  • @Vorsprung 相同结果

标签: json xml go


【解决方案1】:

似乎您在每次迭代后在名为“profile”的节点中重新创建 resultData。发生这种情况时,只有最后一个会到达您编写 JSON 的代码。

试试这个:

decoder := xml.NewDecoder(file)
resultData := map[string]map[string]string{}
for {
    t, _ := decoder.Token()
    if t == nil {
        break
    }

    switch et := t.(type) {
    case xml.StartElement:
        if et.Name.Local == "profile" {
            var object XMLProfile
            decoder.DecodeElement(&object, &et)

            resultData[object.ProfileName] = map[string]string{}

            for _, val := range object.Fields {
                resultData[object.ProfileName][val.Name] = val.Value
            }
        }
    }
}

if out, err := json.MarshalIndent(resultData, "", "\t"); err != nil {
    panic(err)
} else {
    _ = ioutil.WriteFile("test.json", out, 0644)
}

我还会检查是否没有重复的 ProfileName 碰巧出现在 XML 中,因为它会覆盖之前的条目。

【讨论】:

    猜你喜欢
    • 2015-08-27
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多