如何将所有解码的数据写入JSON文件?

时间:2019-05-03 14:39:29

标签: json xml go

我尝试将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"
  }
}

1 个答案:

答案 0 :(得分:0)

似乎您在每次迭代后都在名为“ 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)
}

我还将检查XML中是否没有出现重复的ProfileName,因为它将覆盖先前的条目。