gpt4 book ai didi

json - 如何在 golang 中轻松编辑 JSON 类型(如 Node.js)

转载 作者:IT王子 更新时间:2023-10-29 00:43:15 24 4
gpt4 key购买 nike

我尝试将 node.js 代码转换为 golang 代码。

这是我的示例 JSON。

{
"result": {
"birthInfo": {
"birthYmd": "2018-07-25",
"cattleNo": "cow001",
"docType": "registerBirth",
"lsTypeNm": "redbull",
"monthDiff": "2018-07",
"nationNm": "japan",
"regType": "directly",
"regYmd": "2018-07-25",
"sexNm": "farm001"
},
"breed": {
"dead": {
"deadCd": "deadcd20180725",
"deadYmd": "2018-07-25",
"docType": "reportDeCattle"
},
"earTag": {
"docType": "reattachEartag",
"flatEartagNo": "eartag206015",
"rfidNo": "rfid234234"
}
}
}
}

在使用 node.js 时,很容易像这样获取或访问 json 数据。

let cowbytes = await stub.getState("cow001");
var cowInfo = JSON.parse(cowbytes);

var eartag = {
docType: 'reattachEartag',
flatEartagNo: "eartag206015",
rfidNo: "rfid234234",
};

if (cowInfo.breed) {
cowInfo.breed['earTag'] = eartag;
} else {
cowInfo.breed = {
earTag: eartag
};
}

await stub.putState(args[0], Buffer.from(JSON.stringify(cowInfo)));

这是我对 node.js 代码进行基准测试的 golang 代码。

cowbytes, _: = APIstub.GetState("cow001")
if cowbytes == nil {
return shim.Error("Incorrect value. No cattle Info..")
}

var cowInfo map[string] interface {}
json.Unmarshal(cowbytes, & cowInfo)
eartag: = make(map[string] interface {})

eartag["docType"] = "reattachEartag"
eartag["flatEartagNo"] = string("eartag206015")
eartag["rfidNo"] = string("rfid234234")


_, exists: = cowInfo["breed"]
if exists {
inputJSON,
err: = json.Marshal(cowInfo["breed"])
fmt.Println(err)
out: = map[string] interface {} {}
json.Unmarshal([] byte(inputJSON), & out)
out["earTag"] = struct {
EarTag map[string] interface {}
`json:"earTag"`
} {
eartag,
}
cowInfo["breed"] = out

}
else {
cowInfo["breed"] = struct {
EarTag map[string] interface {}
`json:"earTag"`
} {
eartag,
}
}

cattleAsBytes, _: = json.Marshal(cowInfo)
APIstub.PutState(string("cow001"), cattleAsBytes)

虽然我的 golang 文件工作正常,但我认为它不仅难以编写代码而且性能也很差(重复编码和解码)。

如何在 Golang 中轻松控制 JSON 类型。

有没有人有想法?

最佳答案

您通常必须在性能和简单性之间做出选择。

如果您需要性能,则使用结构对您的 JSON 输入建模,然后您可以使用 selectors 轻松获取/设置不同的部分在你的结构上,你还可以免费获得 Go 的类型安全。注意:有些库和在线服务会自动从输入的 JSON 文本生成 Go 结构,例如 https://mholt.github.io/json-to-go/ .

如果您选择简单,您可以使用允许轻松操作“动态”对象的第 3 方库(例如,映射和 slice ,它们是解码此类 JSON 输入文本的结果)。

其中之一是 github.com/icza/dyno (披露:我是作者)。

使用 dyno,解决方案的简单性接近于 JavaScript。由于 dyno 对映射和 slice 进行操作,因此某些任务可能会更慢,但对于您问题中的这种简单任务,它可能会更快,因为它不使用反射(仅类型断言和类型开关)。

假设标识符 src 包含您输入的 JSON 文本(可以是常量或变量),那么与您的等效的 Go 代码是:

var cowInfo interface{}
if err := json.Unmarshal([]byte(src), &cowInfo); err != nil {
panic(err)
}

eartag := map[string]string{
"docType": "reattachEartag",
"flatEartagNo": "eartag206015",
"rfidNo": "rfid234234",
}

if breed, err := dyno.Get(cowInfo, "result", "breed"); err == nil {
dyno.Set(breed, eartag, "earTag")
} else {
dyno.Set(cowInfo, map[string]interface{}{"earTag": eartag}, "result", "breed")
}

enc := json.NewEncoder(os.Stdout)
enc.SetIndent("", " ")
if err := enc.Encode(cowInfo); err != nil {
panic(err)
}

以上代码解码输入 JSON,执行处理/修改,最后将结果编码到您的控制台。

这是完整的应用程序:Go Playground .注意:你不能在 Go Playground 上运行它,因为它导入了 github.com/icza/dyno(并且那里不允许导入第 3 方库),你必须在本地运行它(在 go正在获取 dyno)。

关于json - 如何在 golang 中轻松编辑 JSON 类型(如 Node.js),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51668365/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com