求 JSON 2个函数

hellsam · 2017-11-12 06:33:17 · 945 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2017-11-12 06:33:17 的主题,其中的信息可能已经有所发展或是发生改变。

求下面的代码 有问题, 我需要 一个转换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
}

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

945 次点击  
加入收藏 微博
14 回复  |  直到 2017-11-13 14:53:06
channel
channel · #1 · 7年之前

你这不是已经写了吗?

hellsam
hellsam · #2 · 7年之前

@channel 这个代码有问题 所以来请教各位大牛

hellsam
hellsam · #3 · 7年之前

求助

polaris
polaris · #4 · 7年之前

有什么问题,报什么错?

hellsam
hellsam · #5 · 7年之前
zhanyiwp
zhanyiwp · #6 · 7年之前

json.Unmarshal 可以直接反序列化到struct啊。你要修改一些值 直接调用json.Unmarshal 反序列化到strcut 然后修改 就行了。不要整个map[string]interface{} 具体到你代码的问题: 61行的错误时返回值个数和声明不匹配 return b,nil 66 传入的参数类型不匹配 json.Unmarshal 的第一参数是[]byte 类型 你不能直接传一个interface

zhanyiwp
zhanyiwp · #7 · 7年之前

一个简单的例子:

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))
}

hellsam
hellsam · #8 · 7年之前

@zhanyiwp 因为JSON值不确定的情况下,

如果用struct的情况下,只能固定了几个JSON值, 要声明太多的struct了

所以我想 让他不限制参数的情况下 取值到MAP 和修改 在转换JSON

zhanyiwp
zhanyiwp · #9 · 7年之前
hellsamhellsam #8 回复

@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
zhanyiwp · #10 · 7年之前
zhanyiwpzhanyiwp #9 回复

#8楼 @hellsam 大致明白你要做什么了,你可以参考下面这个例子,仅仅是可以使用 还有很多细节需要考虑。同时 我觉得你的思路并不是一个好的设计。 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, _ := JSON_Serialize(&test2) fmt.Println(string(req)) req2map, _ := JSON_Deserialize([]byte(req)) fmt.Println(req2map) req2map["Code"] = 5 fmt.Println(req2map) } 这个代码有些问题,比如会不经意间修改了json数据节点的值类型,而不会报错。再比如如果json有嵌套结构你还是需要用类型断言来处理。

晕 这个代码直接粘贴过来 换行没了。。

zhanyiwp
zhanyiwp · #11 · 7年之前
zhanyiwpzhanyiwp #9 回复

#8楼 @hellsam 大致明白你要做什么了,你可以参考下面这个例子,仅仅是可以使用 还有很多细节需要考虑。同时 我觉得你的思路并不是一个好的设计。 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, _ := JSON_Serialize(&test2) fmt.Println(string(req)) req2map, _ := JSON_Deserialize([]byte(req)) fmt.Println(req2map) req2map["Code"] = 5 fmt.Println(req2map) } 这个代码有些问题,比如会不经意间修改了json数据节点的值类型,而不会报错。再比如如果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, _ := JSON_Serialize(&test2)
    fmt.Println(string(req))
    req2map, _ := JSON_Deserialize([]byte(req))
    fmt.Println(req2map)
    req2map["Code"] = 5
    fmt.Println(req2map)
}
hellsam
hellsam · #12 · 7年之前

@zhanyiwp 大牛 因为我只要 转换JSON和 修改JSON后再转换 的2个函数 我大概按照你的试了下

jsonT := `{"Code":"-1","Msg":"code error!"}`   //必须这个取出来要修改的JSON生成好的
Map2, _ := JSON_Deserialize([]byte(jsonT))  //反序列化到MAP中
Map2["Code"] = "10000"
Map2["Msg"] = "OKOK123"  //进行修改 或则新增个
Map2["Return"] = "成功信息"   //比如新增了一个值
//然后到了下面这不 将上面修改好的MAP值 重新转换 JSON值,下面的是【错误的】我乱写的 求指正啊
aaa := JSON_Deserialize(Map2)
    fmt.Fprintln(w, aaa)
hellsam
hellsam · #13 · 7年之前
hellsamhellsam #12 回复

@zhanyiwp 大牛 因为我只要 转换JSON和 修改JSON后再转换 的2个函数 我大概按照你的试了下 ~~~ jsonT := `{"Code":"-1","Msg":"code error!"}` //必须这个取出来要修改的JSON生成好的 Map2, _ := JSON_Deserialize([]byte(jsonT)) //反序列化到MAP中 Map2["Code"] = "10000" Map2["Msg"] = "OKOK123" //进行修改 或则新增个 Map2["Return"] = "成功信息" //比如新增了一个值 //然后到了下面这不 将上面修改好的MAP值 重新转换 JSON值,下面的是【错误的】我乱写的 求指正啊 aaa := JSON_Deserialize(Map2) fmt.Fprintln(w, aaa) ~~~

@zhanyiwp

aaa := JSON_Deserialize(Map2)
    fmt.Fprintln(w, aaa)

这句 是要转换为JSON值
hellsam
hellsam · #14 · 7年之前

@zhanyiwp 谢谢了终于 解决我的困惑了

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传