2015-11-26 26 views
6

各行がJSONであるログファイルがあります。何らかのnginxのセキュリティ上の理由から、ログは16進形式で保存されている(例えば文字「X22を\に変換されます)ここではJSONラインの例です。Go - txtファイルをデコード/変換する方法は16進数の文字列を読み込み可能な文字列に変換する

{ "body_bytes_sent": "474", "params": {\x22device_id\x22: \x221234567890\x22} } 

私の目標:

  1. 行毎にファイルを読み込みます。
  2. このSTR変換

    { "body_bytes_sent": "474", "params" : {"device_id": "1234567890"} } 
    
  3. 読める形式に各行を変換します私はそれを操作することができますJSONオブジェクトに入れて。

助けてください。

答えて

4

あなたは、通常の1に文字列を変換するためにstrconv.Unquoteを使用することができます。

package main 

import (
    "encoding/json" 
    "fmt" 
    "strconv" 
) 

func main() { 

    // this is what your input string looks like... 
    qs := "{\\x22device_id\\x22: \\x221234567890\\x22}" 

    // now let's convert it to a normal string 
    // note that it has to look like a Go string literal so we're 
    // using Sprintf 
    s, err := strconv.Unquote(fmt.Sprintf(`"%s"`, qs)) 
    if err != nil { 
     panic(err) 
    } 
    fmt.Println(s) 

    // just for good measure, let's see if it can actually be decoded. 
    // SPOILER ALERT: It decodes just fine! 
    var v map[string]interface{} 
    if err := json.Unmarshal([]byte(s), &v); err != nil { 
     panic(err) 

    } 
    fmt.Println(v) 
} 

Playground

+0

ありがとう!それは私に私の質問を説明したケースの解決策を与えますが、文字列が有効なJSONと無効なJSONが混在している場合は解決しません。更新された質問を参照してください。再度、感謝します!ところで、これはnginxがリクエストボディparamsだけをエンコードするために起こります。 – Asaf

+0

@Asaf:Not_a_Golferのコードが「有効なJSONと無効なJSONの組み合わせ」で失敗しないのはなぜですか? – Volker

+0

@Not_a_Golferのコードを実行すると、この行にエラーが発生しました。エラー:strconv.Unquote(fmt.Sprintf( "%s"、qs)) ' – Asaf

関連する問題