2016-05-18 9 views
-1

golangのjsonコンテンツを整列するのが困難です。私のオブジェクト内のフィールドの 一つは、XMLコンテンツを含んでおり、時折、それは、次のようなメッセージ主張し、失敗します。私は、これは私のXMLでの制御文字の結果であることを理解し、それを処理する方法を知らないinvalid character '\x..' in string literal無効な文字のためにJsonの非整列化が失敗する

を。 私は私の構造体イムにデシリアライズしようとして mongoosejsでマイドキュメントを保存し、String型としてXMLフィールドを保存するには、このように宣言されています

var xml A 
err := json.Unmarshal(content, &xml) 
+2

あなたは非整列化することができない、このようなXMLを含む例のJSONを投稿することができますか?また、サンプルコードでは、どのように非整列化しようとしていますか? – icza

+0

@iczaこれは非常に長いxml(〜2MB)です。私は正直なところ、ファイルのどこにエラーがあるのか​​分かりません。 – buddy123

+2

@ buddy123ファイルを半分にカットし、どちらの半分にエラーがあるのか​​を確認してください。 – biziclop

答えて

0

JSONは、任意の制御文字を含めることはできませんので、私は例えば、単にBASE64にXMLデータを変換するための最も便利な解決策を見つけた:

// 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) 
+0

encoding/jsonパッケージは、[]バイト値にbase64エンコーディングを使用します。 XmlB64タイプは必要ありません。 –

0

type A struct { 
    Xml []byte `json:"xml"` 
} 

は、アンマーシャリングは次のように行われていますJSONパッケージは[]バイト値をベース64でエンコードされた文字列としてエンコードおよびデコードします。 XMLがベース64でエンコードされていない場合は、エンコードを避けるために型を文字列に変更します。

type A struct { 
    Xml string `json:"xml"` 
} 

別の解決策は、Base64としてXMLをエンコードし、質問に定義されているタイプを残すことです。

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文字列として使用することはできません。

関連する問題