2 回答
TA贡献1775条经验 获得超8个赞
由于 JSON 不能包含任何控制字符,我找到了将 xml 数据简单地转换为 base64 的最方便的解决方案,例如:
// before sending in javascript
a.xml = new Buffer(a.xml).toString('base64')
然后,在 golang 方面:
// Declare a new type for custom unmarshaling
type XmlB64 []byte
func (b *XmlB64) UnmarshalJSON(data []byte) error {
if b == nil {
return fmt.Errorf("UnmarshalJSON on nil pointer")
}
if len(data) == 0 {
return nil
}
if x, err := base64.StdEncoding.DecodeString(string(data)); err != nil {
return err
} else {
*b = x
}
return nil
}
完成此操作后,无需在代码中做任何特殊操作即可完成对 base64 内容的解组。我们首先改变我们的结构:
type A struct {
Xml XmlB64 `json:"xml"`
}
解组:
var xml A
err := json.Unmarshal(content, &xml)
TA贡献1828条经验 获得超4个赞
JSON 包将 []byte 值编码和解码为 base-64 编码字符串。如果 XML 不是 base-64 编码,则将类型更改为字符串以避免编码。
type A struct {
Xml string `json:"xml"`
}
另一种解决方案是将 XML 编码为 base64 并保留问题中定义的类型。
如果 base64 编码不是问题,则打印错误的偏移量并检查该偏移量处的 JSON 文本。
err := json.Unmarshal(content, &xml)
switch err := err.(type) {
case *json.SyntaxError:
fmt.Printf("syntax error at offset %d: %v\n", err.Offset, err)
case *json.UnmarshalTypeError:
fmt.Printf("type error at offset %d: %v\n", err.Offset, err)
case nil:
// no error
default:
fmt.Printf("error %v\n", err)
}
通常,XML 文本不能在没有引号的情况下用作 JSON 字符串。
- 2 回答
- 0 关注
- 356 浏览
添加回答
举报