【发布时间】:2017-07-15 02:13:36
【问题描述】:
我正在尝试为我使用的所有第三方 API 构建聚合服务, 此聚合服务从我的主系统获取 json 值,并将此值放入与第三方 api 密钥等效的键,然后,聚合服务它将向第三方发送请求新的json格式的api。
示例-1:
package main
import (
"encoding/json"
"fmt"
"log"
"github.com/tidwall/gjson"
)
func main() {
// mapping JSON
mapB := []byte(`
{
"date": "createdAt",
"clientName": "data.user.name"
}
`)
// from my main system
dataB := []byte(`
{
"createdAt": "2017-05-17T08:52:36.024Z",
"data": {
"user": {
"name": "xxx"
}
}
}
`)
mapJSON := make(map[string]interface{})
dataJSON := make(map[string]interface{})
newJSON := make(map[string]interface{})
err := json.Unmarshal(mapB, &mapJSON)
if err != nil {
log.Panic(err)
}
err = json.Unmarshal(dataB, &dataJSON)
if err != nil {
log.Panic(err)
}
for i := range mapJSON {
r := gjson.GetBytes(dataB, mapJSON[i].(string))
newJSON[i] = r.Value()
}
newB, err := json.MarshalIndent(newJSON, "", " ")
if err != nil {
log.Println(err)
}
fmt.Println(string(newB))
}
输出:
{
"clientName": "xxx",
"date": "2017-05-17T08:52:36.024Z"
}
我使用 gjson 包从 json 文档中以简单的方式从我的主系统请求中获取值。
示例-2:
import (
"encoding/json"
"fmt"
"log"
"github.com/tidwall/gjson"
)
func main() {
// mapping JSON
mapB := []byte(`
{
"date": "createdAt",
"clientName": "data.user.name",
"server":{
"google":{
"date" :"createdAt"
}
}
}
`)
// from my main system
dataB := []byte(`
{
"createdAt": "2017-05-17T08:52:36.024Z",
"data": {
"user": {
"name": "xxx"
}
}
}
`)
mapJSON := make(map[string]interface{})
dataJSON := make(map[string]interface{})
newJSON := make(map[string]interface{})
err := json.Unmarshal(mapB, &mapJSON)
if err != nil {
log.Panic(err)
}
err = json.Unmarshal(dataB, &dataJSON)
if err != nil {
log.Panic(err)
}
for i := range mapJSON {
r := gjson.GetBytes(dataB, mapJSON[i].(string))
newJSON[i] = r.Value()
}
newB, err := json.MarshalIndent(newJSON, "", " ")
if err != nil {
log.Println(err)
}
fmt.Println(string(newB))
}
输出:
panic: interface conversion: interface {} is map[string]interface {}, not string
我可以通过使用https://golang.org/ref/spec#Type_assertions 来处理这个错误,但是如果这个 json 对象有数组并且这个数组里面有 json 对象怎么办......
我的问题是我有不同的 api,每个 api 都有自己的 json 架构,我映射 json 的方式只有在 第三方 api 只有 json 键值,在这个数组 json 对象中没有嵌套的 json 或数组。
有没有办法映射复杂的 json 架构或 golang 包来帮助我做到这一点?
【问题讨论】:
标签: go