我难以在golang中解组json内容。
我的对象中的一个字段包含xml内容,偶尔会失败,声明如下消息:invalid character '\x..' in string literal
我知道这是我的xml中控制字符的结果,但不知道如何处理它。 我将我的文档存储在mongoosejs中并将xml字段保存为String类型 我尝试反序列化的结构以这种方式声明:
type A struct {
Xml []byte `json:"xml"`
}
解编是按以下方式完成的:
var xml A
err := json.Unmarshal(content, &xml)
答案 0 :(得分:0)
JSON包将[]字节值编码和解码为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字符串。
答案 1 :(得分:0)
由于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
}
完成此操作后,Unmarshalling base64内容在代码中没有做任何特殊操作的情况下完成。我们先改变结构:
type A struct {
Xml XmlB64 `json:"xml"`
}
解组:
var xml A
err := json.Unmarshal(content, &xml)