为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
幕布斯7119047 2022-01-10 17:04:20
我很难在 golang 中解组 json 内容。我的对象中的一个字段包含 xml 内容,有时它会失败,声称消息如下:invalid character '\x..' in string literal我知道这是由于我的 xml 中的控制字符造成的,但不知道如何处理它。我将我的文档存储在 mongoosejs 中,并将 xml 字段保存为类型 String 我试图反序列化的结构是这样声明的:type A struct {  Xml []byte `json:"xml"`}解组是通过以下方式完成的:var xml Aerr := json.Unmarshal(content, &xml)
查看完整描述

2 回答

?
www说

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)


查看完整回答
反对 回复 2022-01-10
?
明月笑刀无情

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 字符串。


查看完整回答
反对 回复 2022-01-10
  • 2 回答
  • 0 关注
  • 356 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信