golang

2016-11-14 10 views
2

でEasyJSONを使用することの私は以下のような構造体を持っているとしましょう: -golang

//easyjson:json 
type JSONData struct { 
    Data []string 
} 

私はアンマーシャリングにJSONData構造体

{"Data" : ["One", "Two", "Three"]} 

に以下のJSONをしたい誰かが私をどのようにすることができます知らせることができますGolangのjsonを非整列化するのにeasyjsonを使用しますか?彼らの中に事例が見つかりませんでしたREADME

+0

easy jsonを使用してアンマーシャリングする必要があるのはなぜですか? – sadlil

答えて

4

easyjsonを使っている理由がわかりません。エンコーディング/ jsonはうまく動作します。しかしここにあなたの答えがあります。

NB:encoding/jsonを使用するとよいでしょう。この構造体の実行easyjson <fileName-JSONData-is-defined>.goを定義した後

//easyjson:json 
type JSONData struct { 
    Data []string 
} 

func (v JSONData) MarshalJSON() ([]byte, error) 
func (v JSONData) MarshalEasyJSON(w *jwriter.Writer) 
func (v *JSONData) UnmarshalJSON(data []byte) errorfunc (v *JSONData) 
func UnmarshalEasyJSON(l *jlexer.Lexer) 

これらのメソッドを追加します。 次に、(未)マーシャルは完全な例は、私がREADME.mdファイルからの命令を使用してインストールhere.

+1

私のjsonブロブはかなり大きいです。 'encoding/json'はかなり遅いようです。そこで 'easyjson'を' encoding/json'よりも3倍から5倍高速にしようと試みています。 – tuk

2

ある

d := &JSONData{} 
d.UnmarshalJSON([]byte(`{"Data" : ["One", "Two", "Three"]} `)) 
// Or you could also use 
// json.Unmarshal(data, d) this will also call this d.UnmarshalJSON 
fmt.Println(d) 

を使用して:

github.com/mailru/を取りに行きますeasyjson/...

この例では、私のGOPATHにディレクトリを作成しました:

$ GOPATH/github.com/jpudney /スタックオーバーフロー/ mypackageとで40587860

tree .            
. 
├── main.go 
└── mypackage 
    ├── example.go 
    └── example_easyjson.go 

/example.go I次のコードを持っている:

package mypackage 

//easyjson:json 
type JSONData struct { 
    Data []string 
} 

その後、内をmypackageディレクトリREADMEから以下のコマンドを実行しました:

easyjson -al l <file> .go

ここでは、<file>を例に置き換えます。だから、次のコマンドを実行してしまった:

easyjson -all example.go 

これは、生成されたコードが含まれているexample_easyjson.goというファイルになります。

私はmain.goファイルを生成し、生成したコードを作成しました。内容は次のとおりです。

package main 

import (
    "encoding/json" 
    "fmt" 

    "github.com/jpudney/stack-overflow/40587860/mypackage" 
) 

func main() { 

    var data mypackage.JSONData 
    jsonBlob := `{"Data" : ["One", "Two", "Three"]}` 

    err := json.Unmarshal([]byte(jsonBlob), &data) 

    if err != nil { 
     panic(err) 
    } 

    fmt.Println(data.Data) 

} 

私が構築し、このファイルを実行し、それが期待通りにデータを出力:

$ go build -o test 
$ ./test 
[One Two Three] 
0

まあ、easyJsonは4倍速い通常のJSONより(そのdocumetsあたりなど)私たちの組織では、これを広範囲に使用しています。ここには小さな例があります。私の現在のディレクトリ名は、easyJson

vimのeasyjson.go

package main 

import "fmt" 
import "time" 
import ej "random/golang/easyJson/model" 

func main() { 
t1 := time.Now() 
var d ej.Data 
d.Name = "sharathbj" 
d.Age = 23 
data, _ := d.MarshalJSON() 
fmt.Println(string(data)) 
fmt.Println("elapsedTime:", time.Now().Sub(t1)) 
} 

あなたの構造が定義されているモデル、および新しいゴーファイルmodels.go

という名前のディレクトリを作成することです

mkdirモデル

vim models.go

package easyJson 

//easyjson:json 
type Data struct { 
    Name string `json:"name"` 
    Age int `json:"age"` 
} 

今easyjsonファイル(指定されたファイル内のすべての構造を参照するために指定-all)を作成するコマンドを実行

easyjson -allモデル/ models.go

今すぐ新しいファイルが生成されますmodels_easyjson.goマーシャリング/アンマーシャリングの参照先を指定します

は、以下のコードであり、easyjson.goは

enter image description here

通常のエンコーディング/ JSONでeasyjson比較するために実行して行く

vimのnormaljson.go

package main 

import (
    "fmt" 
    "time" 
    "encoding/json" 
    model "random/golang/easyJson/model" 
) 
func main() { 
    t1 := time.Now() 
    var d model.Data 
    d.Name = "sharathbj" 
    d.Age = 23 
    data, _ := json.Marshal(d) 
    fmt.Println(string(data)) 
    fmt.Println("elapsedTime:", time.Now().Sub(t1)) 
} 

enter image description here

は明らかにeasyjson速く、通常のJSONより7マイクロ秒である、とあなたは大きな構造のためにそれを行うとき、uは下記のソースコードを見ることができ、その影響を確認します。
https://github.com/sharathbj/random/tree/master/golang/easyJson

Chears !!