在实际开发中,经常会遇到需要定制json编解码的情况。

比如,按照指定的格式输出json字符串,

又比如,根据条件决定是否在最后的json字符串中显示或者不显示某些字段。

如果希望自己定义对象的编码和解码方式,需要实现以下两个接口:

type Marshaler interface {
MarshalJSON() ([]byte, error)
}
type Unmarshaler interface {
UnmarshalJSON([]byte) error
}

对象实现接口后,编解码时自动调用自定义的方法进行编解码。

下面例子中,自定义编解码方法。

编码时,将map转化为字符串数组。

解码时,将字符串数组转化为map。

package main

import (
"encoding/json"
"fmt"
) type Bird struct {
A map[string]string `json:"a"`
} func (bd *Bird) MarshalJSON() ([]byte, error) {
l := []string{}
for _,v := range bd.A {
l = append(l,v)
} return json.Marshal(l)
} func (bd *Bird) UnmarshalJSON(b []byte) error {
l := []string{}
err := json.Unmarshal(b, &l)
if err != nil {
return err
} for i,v := range l {
k := fmt.Sprintf("%d", i)
bd.A[k] = v
} return nil
} func main() { m := map[string]string{"1": "110", "2":"120", "3":"119"}
xiQue := &Bird{A:m} xJson, err := json.Marshal(xiQue)
if err != nil {
fmt.Println("json.Marshal failed:", err)
} fmt.Println("xJson:", string(xJson)) b := `["apple", "orange", "banana"]` baoXiNiao := &Bird{A:map[string]string{}}
err = json.Unmarshal([]byte(b), baoXiNiao)
if err != nil {
fmt.Println("json.Unmarshal failed:", err)
} fmt.Println("baoXiNiao:", baoXiNiao)
}

output:

xJson: ["110","120","119"]

baoXiNiao: &{map[0:apple 1:orange 2:banana]}

参考

https://golang.org/pkg/encoding/json/

https://blog.csdn.net/tiaotiaoyly/article/details/38942311

golang 自定义json解析的更多相关文章

  1. 自定义Json解析工具

    此博客为博主原创文章,转载请标明出处,维权必究:https://www.cnblogs.com/tangZH/p/10689536.html fastjson是很好用的json解析工具,只可惜项目中要 ...

  2. golang 自定义time.Time json输出格式

    工作中使用golang时,遇到了一个问题.声明的struct含time.Time类型.使用json格式化struct时,time.Time被格式化成”2006-01-02T15:04:05.99999 ...

  3. Golang ---json解析

    golang官方为我们提供了标准的json解析库–encoding/json,大部分情况下,使用它已经够用了.不过这个解析包有个很大的问题–性能.它不够快,如果我们开发高性能.高并发的网络服务就无法满 ...

  4. Json解析工具Jackson(使用注解)--jackson框架自定义的一些json解析注解

    Json解析工具Jackson(使用注解)--jackson框架自定义的一些json解析注解 @JsonIgnoreProperties 此注解是类注解,作用是json序列化时将Javabean中的一 ...

  5. SpringBoot 默认json解析器详解和字段序列化自定义

    前言 在我们开发项目API接口的时候,一些没有数据的字段会默认返回NULL,数字类型也会是NULL,这个时候前端希望字符串能够统一返回空字符,数字默认返回0,那我们就需要自定义json序列化处理 Sp ...

  6. golang struct 定义中json``解析说明

    在代码学习过程中,发现struct定义中可以包含`json:"name"`的声明,所以在网上找了一些资料研究了一下 package main import ( "enco ...

  7. 【golang】json数据解析 - 嵌套json解析

    @ 目录 1. 通过结构体映射解析 2. 嵌套json解析-map 1. 通过结构体映射解析 原数据结构 解析 // 结构体 type contractJson struct { Data []tra ...

  8. Android okHttp网络请求之Json解析

    前言: 前面两篇文章介绍了基于okHttp的post.get请求,以及文件的上传下载,今天主要介绍一下如何和Json解析一起使用?如何才能提高开发效率? okHttp相关文章地址: Android o ...

  9. Json解析工具Jackson(使用注解)

    原文http://blog.csdn.net/nomousewch/article/details/8955796 接上一篇文章Json解析工具Jackson(简单应用),jackson在实际应用中给 ...

随机推荐

  1. python构造IP报文

    import socket import sys import time import struct HOST, PORT = "10.60.66.66", 10086 def m ...

  2. 【Python】创建xml文档

    #练习:创建xml文档 import xml.dom.minidom import codecs   #在内存中创建一个空的文档 doc = xml.dom.minidom.Document()   ...

  3. HTTP Security Header Not Detected未检测到HTTP安全标头

    遇到此安全问题,只需修改Web.config文件. 如: 未处理之前配置代码如下: <httpProtocol> <customHeaders> <add name=&q ...

  4. 查询表Or列的注释信息

    需求:开发人员需要DBA支持,查询表的注释说明,用于明确表的用途. 1.测试 session 1 创建测试表SQL> create table a_emp as select * from sc ...

  5. C语音下改变const变量的值的奇葩方法

    恶心,超恶心~~

  6. SFM学习记录(二)

    分析生成文件 在.nvm.cmvs/00/下有:(也可能是其他数字) models/option-0000.ply:是生成的密集点云模型 txt:文件夹下(还没弄明白ν_v) visualize:保存 ...

  7. nginx根据url中的参数进行转发

    在实际项目中,由于https安全策略,我们无法直接跳转到我们想要跳转到的地址 例如 url:https://abc.dc.com/image?url=https://vpic.video.qq.com ...

  8. nginx的安装 、Nginx默认虚拟主机、nginx用户认证、nginx 域名重定向

    1.nginx:官网:www.nginx.org 下载:wget -c  http://nginx.org/download/nginx-1.14.0.tar.gz解压:tar -zxvf nginx ...

  9. (5)css样式导入

    样式的组成 1.选择器:将样式与页面中的某一个或某些标签建立联系,就要使用选择器,在head标签下写一个style标签,将需控制参数的标签名写在这个style标签下,设置属性即可通过css来控制htm ...

  10. 铁三测试题——权限、你是管理员吗?——WP

    权限 [题目描述]:你是管理员吗? [解题链接]:http://ctf4.shiyanbar.com/web/root/index.php 首先看题,提到“权限”,“管理员”,这就是说涉及到管理员的账 ...