求下面的代码 有问题, 我需要 一个转换JSON 一个反序列化到MAP 方便修改值,思路这样的
比如生成JSON值
var a map[string]interface{}
a["code"]="100"
a["msg"]="ok"
result := JSON_Serialize(a)
//这样result得到一串JSON值了
================
反序列化
从数据库或则字符串获取得到一串JSON值
bb := `{"Code":"-1","Msg":"code error!"}`
result2 :=JSON_Deserialize(bb)
//然后修改一些值 修改完毕再转换JSON即可
result2["Code"]=="200"
result2["Msg"]="no123"
result3 := JSON_Serialize(result2)
func JSON_Serialize(obj interface{}) (mapOBJ map[string]interface{}, err error) {
b, err := json.Marshal(obj)
if err != nil {
return nil, err
}
return b
}
func JSON_Deserialize(obj interface{}) (mapOBJ map[string]interface{}, err error) {
var result map[string]interface{}
if err := json.Unmarshal(obj, &result); err != nil {
return nil, err
}
return result, nil
}
有疑问加站长微信联系(非本文作者)

你这不是已经写了吗?
@channel 这个代码有问题 所以来请教各位大牛
求助
有什么问题,报什么错?
@polaris
json.Unmarshal 可以直接反序列化到struct啊。你要修改一些值 直接调用json.Unmarshal 反序列化到strcut 然后修改 就行了。不要整个map[string]interface{} 具体到你代码的问题: 61行的错误时返回值个数和声明不匹配 return b,nil 66 传入的参数类型不匹配 json.Unmarshal 的第一参数是[]byte 类型 你不能直接传一个interface
一个简单的例子:
type result struct {
Code string
Msg string
}
func main() {
Res := result{Code: "0", Msg: ""} bb :=
{"Code:":"-1","Msg":"code error!"}
json.Unmarshal([]byte(bb), &Res) Res.Code = "200"Res.Msg = "no123"
result2, _ := json.Marshal(&Res)
fmt.Println(string(result2))
}
@zhanyiwp 因为JSON值不确定的情况下,
如果用struct的情况下,只能固定了几个JSON值, 要声明太多的struct了
所以我想 让他不限制参数的情况下 取值到MAP 和修改 在转换JSON
大致明白你要做什么了,你可以参考下面这个例子,仅仅是可以使用 还有很多细节需要考虑。同时 我觉得你的思路并不是一个好的设计。
package main
import ( "encoding/json" "fmt" )
type Test struct { Name string Sex string Age int }
type Test2 struct { Code int Msg Test }
func JSON_Serialize(obj interface{}) (b []byte, err error) { b, err = json.Marshal(obj) if err != nil { return nil, err } return b, nil }
func JSON_Deserialize(req []byte) (s map[string]interface{}, err error) { err = json.Unmarshal(req, &s) if err != nil { return nil, err } return s, nil }
func main() { test := Test{"zy", "male", 20} test2 := Test2{0, test} req, _ := JSONSerialize(&test2) fmt.Println(string(req)) req2map, := JSON_Deserialize([]byte(req)) fmt.Println(req2map) req2map["Code"] = 5 fmt.Println(req2map) }
这个代码有些问题,比如会不经意间修改了json数据节点的值类型,而不会报错。再比如如果json有嵌套结构你还是需要用类型断言来处理。
晕 这个代码直接粘贴过来 换行没了。。
@zhanyiwp 大牛 因为我只要 转换JSON和 修改JSON后再转换 的2个函数 我大概按照你的试了下
@zhanyiwp
@zhanyiwp 谢谢了终于 解决我的困惑了