将EasyJSON与golang一起使用

时间:2016-11-14 11:38:55

标签: json go

假设我有一个如下结构: -

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

我想将下面的json解组为JSONData struct

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

有人可以告诉我如何使用easyjson在Golang中解组json吗?我在README

中找不到任何示例

3 个答案:

答案 0 :(得分:6)

我不知道你为什么要尝试使用easyjson。 encoding / json可以很好地使用。但是,虽然这是你的答案。

注意:如果你使用encoding / json会更好。

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

定义此结构后运行easyjson <fileName-JSONData-is-defined>.go。这将创建一个包含

的额外go文件
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)

那些方法。 然后使用

(un-)编组
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)

一个完整的例子是here.

答案 1 :(得分:1)

嗯,easyJson比普通json快4倍(根据其文档),在我们的组织中,我们广泛使用它,是的,它更快。这是一个开始的小例子。我当前的目录名是 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))
}

创建一个名为model的目录,其中定义了您的结构,并创建了新的go文件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 model / models.go

现在将生成一个新文件 models_easyjson.go ,使用哪个编组/解组将被引用

  

go run easyjson.go

enter image description here

要将easyjson与普通编码/ json进行比较,下面是代码

  

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微秒,你会看到它对更大结构的影响,你可以看到下面的源代码。
 https://github.com/sharathbj/random/tree/master/golang/easyJson

CHEARS !!

答案 2 :(得分:0)

我使用README.md文件中的说明安装:

  

去github.com/mailru/easyjson /...

然后我在我的GOPATH中为这个例子创建了一个目录:

  

$ GOPATH / github.com / jpudney /堆栈溢出/ 40587860

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

在mypackage / example.go中,我有以下代码:

package mypackage

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

然后,在mypackage目录中,我从README运行以下命令:

  

easyjson -all <file>。去

我用示例替换<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]