• Go:json(序列化、反序列化)


    一、示例

    package main
    
    import (
        "encoding/json"
        "fmt"
    )
    
    type Person struct {
        Name    string  `json:"name"`
        Age     int     `json:"age"`
        Salary  float64 `json:"salary"`
    }
    
    type Student struct {
        Name    string  `json:"name"`
        Age     int     `json:"age"`
        Salary  float64 `json:"salary"`
    }
    
    // 对数据进行序列化
    func marshalData(data interface{}) []byte{
        data, err := json.Marshal(data)
        if err != nil {
            fmt.Printf("序列化失败:%s
    ", err)
        }
        fmt.Printf("序列化结果:%v
    ", data)
        fmt.Printf("序列化结果:%s
    ", data)
        return data.([]byte)
    }
    
    // 对 struct 进行序列化
    func marshalStruct() []byte {
        person := Person{
            Name: "佩奇",
            Age: 18,
            Salary: 99.99,
        }
        fmt.Printf("原始的数据:%v
    ", person)
        return marshalData(person)
    }
    
    // 对 map 进行序列化
    func marshalMap() []byte {
        var m map[string]interface{}
        m = make(map[string]interface{})
        m["name"] = "盲僧"
        m["age"] = 10
        m["hobby"] = [2]string{"篮球", "游泳"}
        fmt.Printf("原始的数据:%v
    ", m)
        return marshalData(m)
    }
    
    // 对 map 切片进行序列化
    func marshalSlice() []byte {
        var slice []map[string]interface{}
        m1 := map[string]interface{}{
            "name": "妖姬",
            "age": 20,
        }
        slice = append(slice, m1)
        m2 := map[string]interface{}{
            "name": "德玛",
            "age": 30,
        }
        slice = append(slice, m2)
        fmt.Printf("原始的数据:%v
    ", slice)
        return marshalData(slice)
    }
    
    // 反序列化成 struct
    func unmarshalStruct(data []byte) {
        // 定义一个 Student 实例
        var student Student
        err := json.Unmarshal([]byte(data), &student)
        if err != nil {
            fmt.Println(err)
        }
        fmt.Println("反序列化结果:", student)
    }
    
    // 反序列化成 map
    func unmarshalMap(data []byte) {
        // 定义一个 map
        var m map[string]interface{}
        // 注意:反序列化 map,不需要 make,因为 make 操作被封装到了 Unmarsha 函数中
        err := json.Unmarshal([]byte(data), &m)
        if err != nil {
            fmt.Println(err)
        }
        fmt.Println("反序列化结果:", m)
    }
    
    // 反序列化成 slice
    func unmarshalSlice(data []byte) {
        // 定义一个 silce
        var slice []map[string]interface{}
        // 注意:反序列化 slice,不需要 make,因为 make 操作被封装到了 Unmarsha 函数中
        err := json.Unmarshal([]byte(data), &slice)
        if err != nil {
            fmt.Println(err)
        }
        fmt.Println("反序列化结果:", slice)
    }
    
    func main() {
        // 序列化
        result1 := marshalStruct()
        fmt.Println()
        result2 := marshalMap()
        fmt.Println()
        result3 := marshalSlice()
        fmt.Println()
        // 反序列化
        unmarshalStruct(result1)
        unmarshalMap(result2)
        unmarshalSlice(result3)
    }
    View Code

    二、注意!!!

    在反序列化一个 json 字符串时,要确保反序列化后的数据类型序列化之前的数据类型一致。

  • 相关阅读:
    [UWP]使用CompositionLinearGradientBrush实现渐变画笔并制作动画
    [WPF 自定义控件]模仿UWP的ProgressRing
    [UWP]占领标题栏
    [WPF 自定义控件]关于ScrollViewer和滚动轮劫持(scroll-wheel-hijack)
    [WPF 自定义控件]给WPF一个HyperlinkButton
    VisualStudio中的单元测试
    重温《单元测试的艺术》,总结常用知识点
    [WPF 自定义控件]自定义Expander
    nhibernate入门使用经验
    个人搜藏小技巧:eclipse 设定proxy,仍不能连网的问题
  • 原文地址:https://www.cnblogs.com/believepd/p/10952897.html
Copyright © 2020-2023  润新知