由于字符无效,Json unmarshal失败

时间:2016-05-18 08:47:54

标签: 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)

2 个答案:

答案 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)