由于字符无效,Json 解码失败

标签 json xml go

我很难在 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)

最佳答案

由于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)

关于由于字符无效,Json 解码失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37294556/

相关文章:

java - Android工作室: dont work JsonArrayRequest

c# - 从类中的列表属性中删除元素

java - 终端中的 Selenium Webdriver : How to run testNG. xml 文件(在 MAC 中)?

go - 为什么atomic.Value不能在第一个Store之后复制?

go - 如何在 golang 中构建 .a 文件

iphone - 如何在iOS中将JSON字符串保存到Sqlite的一个字段中?

json - 编码/解码时 UIImage 不等效

go - Web 服务器代码流

json - Grails 2.5.0 静态编译、 Controller 和 grails 功能

xml - 是否可以使用 Metro Web 服务框架获取原始 XML 有效负载?