在实际开发中,经常会遇到需要定制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. Nginx 自动补全url地址补全最后的斜线

    参考地址: http://blog.csdn.net/dong123dddd/article/details/51660368 location /riskcontrol { root /data; ...

  2. Oracle流程控制语句

    1.选择语句 1.1 IF...THEN...END IF语句 DECLARE MY_AGE INT; IF MY_AGE IS NULL THEN DBMS_OUTPUT.put_line('AGE ...

  3. shell 批量计算MD5值

    #!/bin/sh #需要计算MD5文件列表 # list=`ls` list="file list" for file in $list do file1=`` echo &qu ...

  4. matlab一行太长

    太长了,一行写不下,所以用...接下一行 例子: x=[ mvnrnd( mu_real(:,1) , cov_real(:,:,1) , round(N*a_real(1)) )' ,... mvn ...

  5. Samsung_tiny4412(驱动笔记03)----字符设备驱动基本操作及调用流程

    /*********************************************************************************** * * 字符设备驱动基本操作及 ...

  6. python time 时间处理

    a='2018-03-26 17:20:11' >>> print time.strftime("%Y%m%d", a)Traceback (most recen ...

  7. StackExchange.Redis和Log4Net构建日志

    利用StackExchange.Redis和Log4Net构建日志队列   简介:本文是一个简单的demo用于展示利用StackExchange.Redis和Log4Net构建日志队列,为高并发日志处 ...

  8. 《DSP using MATLAB》Problem 6.7

    代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...

  9. python------模块定义、导入、优化 ------->xml模块

    1. xml模块 引用参考原文链接:https://www.cnblogs.com/python-gm/p/8032465.html      谢谢 xml是实现不同语言或程序之间进行数据交换的协议, ...

  10. Go Example--协程

    package main import "fmt" func main() { //main gorouting中调用f函数 f("direct") //重新建 ...