注: 本帖会不定时根据踩到坑进行中新
- XML Marshal,无法为key打上namespace别名的问题 我希望处理出来的xml如下:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:sap-com:document:sap:rfc:functions">
<soapenv:Header></soapenv:Header>
<soapenv:Body>
<urn:ZSDSO_LIST_STATUS>
<E_OUTPUT></E_OUTPUT>
<I_KUNNR>12345678</I_KUNNR>
<I_STATUS>01</I_STATUS>
</urn:ZSDSO_LIST_STATUS>
</soapenv:Body>
</soapenv:Envelope>
使用encoding/xml,当带上别名生成xml时, 只能生成一个xmlns="http://xxxxxaaaaa" 这样的namespace,不支持别名。
替代处理方案是,先生成不带namespace的xml,但是为Envelope生成soapenv和urn两个属性值。然后将该xml数据流使用正则行处理替换成带别名的格式
2. 结构体的json处理时,字段首字母的坑
package main
import (
"encoding/json"
"fmt"
)
type testjson struct {
door string
wind string
}
func main() {
jsonData := []byte(`{
"door":"bigdoor",
"wind":"smalwind"
}`)
var newjson testjson
err := json.Unmarshal(jsonData, &newjson)
if err != nil {
panic(err)
}
fmt.Println(newjson.wind)
fmt.Println(newjson.door)
}
上面的代码,很遗憾,只能得到两个空行。因为字段为小写字母开头,无法解析,即使是在同一个包中使用结构体!
只好定义成如下所示:
type testjson struct {
Door string `json:"door"`
Wind string `json:"wind"`
}
这个很无语,但也只好捏着鼻子认了