为了账号安全,请及时绑定邮箱和手机立即绑定

使用 EasyJSON 和 golang

使用 EasyJSON 和 golang

Go
小唯快跑啊 2022-04-20 17:56:44
假设我有一个如下结构: -//easyjson:jsontype JSONData struct {    Data []string}我想将下面的 json 解组为JSONDatastruct{"Data" : ["One", "Two", "Three"]} 有人可以告诉我如何使用easyjson在Golang中解组json吗?我在他们的文章中找不到任何例子README
查看完整描述

3 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

好吧,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 模型.go


package easyJson


//easyjson:json

type Data struct {

  Name string `json:"name"`

  Age  int    `json:"age"`

}

现在运行命令来创建一个easyjson文件(-all指定引用给定文件中的所有结构)


easyjson -所有模型/models.go


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


去运行easyjson.go

//img1.sycdn.imooc.com//625fd8f700019a8d04510056.jpg

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


vim 普通json.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))

 }

//img1.sycdn.imooc.com//625fd9030001480d04590054.jpg

显然 easyjson 比普通 json 快 7 微秒,当你对更大的结构执行它时,你会看到它的影响,你可以看到下面的源代码。
https://github.com/sharathbj/random/tree/master/golang/easyJson

干杯!!


查看完整回答
反对 回复 2022-04-20
?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

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


去获取 github.com/mailru/easyjson/...


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


$GOPATH/github.com/jpudney/stack-overflow/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>.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]


查看完整回答
反对 回复 2022-04-20
?
动漫人物

TA贡献1815条经验 获得超10个赞

我不知道您为什么要尝试使用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)

那些方法。然后(取消)编组使用


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)


查看完整回答
反对 回复 2022-04-20
  • 3 回答
  • 0 关注
  • 252 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信