interface{}类型通过json.Unmarshal之后的类型

2023-10-27

一句话总结:所有JSON数值类型一律解析为float64类型,需手动转换;对于map类型需判断是否为nil再转换为所需类型。

interface{}类型在json.Unmarshal时,会自动将JSON转换为对应的数据类型:
JSON的boolean 转换为bool
JSON的数值 转换为float64
JSON的字符串 转换为string
JSON的Array 转换为[]interface{}
JSON的Object 转换为map[string]interface{},也可以转为本身类型
JSON的null 转换为nil

package main

import (
    "encoding/json"
    "fmt"
)

type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
    Addr string `json:"addr,omitempty"`
}

func main() {
    var m map[string]interface{}     //声明变量,不分配内存
    m = make(map[string]interface{}) //必可不少,分配内存
    m["name"] = "simon"
    var age int = 12
    m["age"] = age
    m["addr"] = "China"
    print_map(m)
    fmt.Println()

    data, _ := json.Marshal(m)

    m1 := make(map[string]interface{})
    _ = json.Unmarshal(data, &m1)
    print_map(m1)
    fmt.Println()

    if m1["name"] != nil {
        fmt.Println(m1["name"].(string))
    }
    if m1["type"] != nil {
        fmt.Println(m1["type"].(string))
    } else {
        fmt.Println("there is not the key of type")
    }
    fmt.Println()

    p := Person{"simon", 22, "China"}
    data, _ = json.Marshal(p)
    p1 := Person{}
    _ = json.Unmarshal(data, &m1)
    _ = json.Unmarshal(data, &p1)
    fmt.Println("map m1:", m1)
    fmt.Println("person:", p1)
    fmt.Println(m1["name"], m1["age"], m1["addr"])
    fmt.Println(p1.Name, p1.Age, p1.Addr)
}
运行结果
name is string simon
age is int 12
addr is string China

addr is string China
age is float64 12
name is string simon

simon
there is not the key of type

map m1: map[addr:China age:22 name:simon]
person: {simon 22 China}
simon 22 China
simon 22 China

Process finished with exit code 0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

interface{}类型通过json.Unmarshal之后的类型 的相关文章

  • 使用 mgo 驱动程序进行 mongo 聚合查询

    我在 mongodb 中有以下查询 db devices aggregate match userId v73TuQqZykbxFXsWo state true project userId 1 categorySlug 1 weight
  • SWI-Prolog 中的跨模块“接口”调用

    这可能是 SWI Prolog 模块系统特有的 假设我们有三个 Prolog 模块 在 SWI Prolog 模块系统中 robin 在文件中robin pl arthur 在文件中arthur pl helper 在文件中helper p
  • 在复杂的文件夹结构中进行测试

    我正在 golang 中构建一个设计模式存储库 为了运行所有测试 我使用这个 bash 脚本 有用 bin bash go test creational abstract factory go go test creational bui
  • 单值上下文中的多值错误

    我在编译 GO 代码时遇到此错误 multiple value fmt Println in single value context 我正在尝试创建一个函数 该函数接受可变数量的整数并将每个变量打印在一行上 GO package main
  • 为什么不直接使用 DateTime.Now 呢?

    最近一直在努力学习接口方面的知识 我看到了这段代码 但无法理解为什么你不直接使用DateTime Now在其自己的 我不确定为什么这个界面很有用 有人可以解释一下吗 这本书的作者试图解释 但我不太明白如何按照他们所说的方式实现它 程序员是否
  • 有没有办法间歇性地执行重复性任务?

    有没有办法在 Go 中执行重复的后台任务 我在想类似的事情Timer schedule task delay period 在爪哇 我知道我可以用 goroutine 来做到这一点Time sleep 但我想要一些容易停止的东西 这是我得到
  • container_memory_working_set_bytes 与 process_resident_memory_bytes 和total_rss 之间的关系

    我希望了解以下关系 容器内存工作集字节 vs 进程驻留内存字节 vs 总计RSS 容器内存 rss 文件映射以便更好地配备OOM可能性警报系统 这似乎违背了我的理解 这让我现在感到困惑 如果容器 pod 运行单个进程 执行用 Go 编写的编
  • 优化查找所有实现 IInterface 的类以及使用特定类型显式实现它的类

    我定义了一个接口 ISerializeDeserialize 和一些继承通用接口的类 我还有一些使用 CodeDomProvider 生成代码的程序集 它生成从同一接口继承的类 但使用特定类型实现它 我想要实现的是获取通用实现和实现特定类型
  • 从 Golang 调用 C 函数

    我想在 Golang 中编写控制器逻辑并处理 json 和数据库 同时在 C 中使用我的数学处理模型 在我看来 调用 C 函数的开销必须尽可能低 就像设置寄存器 rcx rdx rsi rdi 一样 执行一些操作fastcall 并获取 r
  • 如何在golang中获得两个切片的交集?

    Go 中有没有有效的方法来获取两个切片的交集 我想避免嵌套 for 循环之类的解决方案slice1 string foo bar hello slice2 string foo bar intersection slice1 slice2
  • 子字符串和 Go 垃圾收集器

    在 Go 中获取字符串的子字符串时 不会分配新的内存 相反 子字符串的底层表示包含一个数据指针 该指针是原始字符串的数据指针的偏移量 这意味着 如果我有一个大字符串并希望跟踪一个小子字符串 则垃圾收集器将无法释放任何大字符串 直到我释放对较
  • 比较:接口方法、虚方法、抽象方法

    它们各自的优点和缺点是什么 接口方法 虚拟方法 抽象方法 什么时候应该选择什么 做出这一决定时应牢记哪些要点 虚拟和抽象几乎是一样的 虚方法在基类中有一个实现 可以选择重写 而抽象方法则没有 并且must在子类中被覆盖 否则它们是相同的 在
  • java中将函数作为参数传递

    我正在熟悉 Android 框架和 Java 并希望创建一个通用的 NetworkHelper 类 该类将处理大部分网络代码 使我能够从中调用网页 我按照developer android com 上的这篇文章创建了我的网络类 http d
  • 点击界面没有出现

    我决定添加一个点击界面并在我的代码中使用它 但我能够得到它的状态 sudo ip f link tuntap add tap10 mode tap sudo ip link set tap10 up 之后当我执行 ip link 时 tap
  • 管理多租户 ArangoDB 连接

    我使用 ArangoDB Go 使用 go driver 并且需要实现多租户 这意味着每个客户都将在单独的数据库中拥有他的数据 我想要弄清楚的是如何使这种多租户发挥作用 我知道为每个请求创建一个新的数据库连接是不可持续的 这意味着我必须维护
  • C# 如何在运行时动态生成实现不同接口的对象?

    我正在研究如何解决问题 但我什至不确定这在 C 和 NET 3 5 中是否可行 假设我的接口数量有限 每个接口都描述一组特定的 不相关的方法 现在我有许多现实世界的设备 每个设备都可以仅实现这些接口的一个子集 在与这些设备建立通信期间 他们
  • 如何在GO中执行HEAD请求?

    我想使用 GO net http 获取页面的内容长度 我可以在终端中使用curl i X HEAD https golang org然后检查内容长度字段 use http Head https golang org pkg net http
  • Go的堆接口实现的优先级队列的大小限制

    在Java中 有一个具有大小属性 的PriorityQueue 我在这里也期待同样的事情 如果我没记错的话 用例 一一读取数百万数据并将其发送到优先级队列 我只想要前 5 个计算元素 因此我只想要大小为 5 的堆 优先级队列 我正在尝试使用
  • 我使用go语言打印到POS打印机,但打印出的中文字符很糟糕。 (英语没问题)

    我在用着this https github com alexbrainman printer去打包 一切都很好 但汉字打印得很差 我不擅长这种低级 硬件 编码的事情 所以有人提示我如何纠正我的代码 更新代码 func main testWi
  • 如何使用 exec.Command 在 golang 中执行 Mysql 脚本

    您好 我正在尝试执行一个脚本以使用 Golang 将数据填充到数据库中 func executeTestScript cmd exec Command usr local mysql bin mysql h127 0 0 1 P3333 u

随机推荐

  • 23种设计模式之策略模式

    文章目录 概览 策略模式的优缺点 策略模式的应用场景 策略模式的结构与实现 模式的结构 模式的实现 策略模式的扩展 总结 概览 策略模式定义了一系列算法 并将每个算法封装起来 使他们可以相互替换 且算法的变化不会影响到使用算法的客户 需要设
  • Python从入门到放弃(三):基本语句和语法

    一 一些改变 1 Python增加了什么 相比起C 或者其他一些语言 Python增加了一个冒号 所有的python复合语句 都是首行由冒号来提醒 这个一定不能够掉了 且接下来是以缩进的形式来书写 C 或者一些语言是大括号括起来的 后面会看
  • 【算法与数据结构】98、LeetCode验证二叉搜索树

    文章目录 一 题目 二 解法 三 完整代码 所有的LeetCode题解索引 可以看这篇文章 算法和数据结构 LeetCode题解 一 题目 二 解法 思路分析 注意不要落入下面你的陷阱 笔者本来想左节点键值 lt 中间节点键值 lt 右节点
  • 传感器i2c与arduino连接_Arduino中进行I2C通信发送数据案例分析

    在之前的文章中 我们介绍了Arduino之间的SPI通信 今天我们将学习另一种串行通信协议 I2C 内部集成电路 比较I2C和SPI I2C只有两条线 而SPI使用四条 I2C可以有多个主机和从机 而SPI只能有一个主机和多个从机 因此 如
  • docker容器连接宿主机redis和mysql

    当我们在用docker部署项目的时候可能会遇到这样一个问题 项目A和项目B都用到了redis和mysql 如果在docker compose里link或者dependon一个redis和mysql的话 会发现每一个项目都有一个redis和m
  • static作用:静态变量的生存周期和作用域

    首先要理解生存周期与作用域的区别 生存周期 变量从定义到销毁的时间范围 存放在全局数据区的变量的生存周期存在于整个程序运行期间 而存放在栈中的数据则随着函数等的作用域结束导致出栈而销毁 除了静态变量之外的局部变量都存放于栈中 作用域 变量的
  • 多路开关模式的switch语句

    在实例10中 将break语句去掉之后 会将符合检验条件后的所有语句都输出 利用这个特点 可以设计多路开关模式的switch语句 例如 在平年一年12个月 1 3 5 7 8 10 12月是31天 4 6 9 11月是30天 2月是28天
  • 第1144期AI100_机器学习日报(2017-11-05)

    AI100 机器学习日报 2017 11 05 聊天机器人Chatbot知识资料全集 入门 进阶 论文 软件 数据 专家等 wx 专知内容组 推荐中的序列化建模 Session based neural recommendation wx
  • Echarts饼状legend如何自动显示值和百分比

    效果图如下 重点在legend里如何设置 显示值和百分比 div class div block strong class block box title 硬盘使用情况 总容量 total strong div div div
  • 如何写出好的接口测试用例?一文1500字从0到1教你写一个合格的接口测试用例

    作为测试人 我们经常要对项目中的接口进行接口测试 那么在做接口测试的时候 如何写接口测试用例呢 如何写出好的接口测试用例呢 什么是接口测试 首先我们要了解一下 什么是接口测试 那么首先要搞清楚 我们一般说的接口到底是什么 一般狭义上说的都是
  • Linux查看二进制文件

    方法一 使用hexedit 下载 sudo apt get install hexedit 然后使用hexedit命令就行了 方法二 使用vim 先用vim b file打开文件 然后输入 xxd命令转换为十六进制 输入 xxd r返回原显
  • IntelliJ IDEA:删除当前一整行

    参考 https blog csdn net weixin 40836179 article details 81360342
  • 从 Spec.到芯片_(数字IC、模拟IC、FPGA/CPLD设计的流程及EDA工具)

    从 Spec 到芯片 先来看张图 本图体现出了集成电路产业链 设计业 制造业 封测业 关于制造 封装测试我们看两张图稍作了解即可 关于设计 是本文主要内容 主要从下方几个方面了解 1 IC设计大致分类 2 IC设计需要考虑的因素 3 数字I
  • 01LinuxC线程学习之线程概念,简述与进程区别和查看LWP轻量级线程号(不是PID也不是TID))

    1 线程 1 1 线程概念 1 线程概念 每个线程有各自的PCB 但没有独立的地址空间 共享 注 该地址空间指的是以进程为单位 不是指栈 而进程拥有独立地址空间 拥有PCB 2 LWP light weight process 轻量级的进程
  • 【华为OD机试真题2023B卷 JAVA&JS】IPv4地址转换成整数

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 IPv4地址转换成整数 时间限制 1秒 内存限制 262144K 语言限制 不限 题目描述 存在一种虚拟IPv4地址 由4小节组成 每节的范围为0 255 以 号间隔 虚拟IPv4地址
  • Midjourney如何集成到自己(个人/企业)的平台(一)

    背景概述 目前Midjourney没有对外开放Api 想体验他们的服务只能在discord中进入他们的频道进行体验或者把他们的机器人拉入自己创建的服务器中 目前免费的已经无法体验了 需要使用就订阅 在网上搜索相应资料也是一知半解的 没有能照
  • tomcat 线程池和连接池

    在介绍如何配置tomcat线程池和连接池之前 先介绍一下线程池和连接池的原理 线程池的原理 其实线程池的原理很简单 类似于操作系统中的缓冲区的概念 它的流程如下 先启动若干数量的线程 并让这些线程都处于睡眠状态 当客户端有一个新请求时 就会
  • C# WPF并行计算两个矩阵

    并行计算两个矩阵 要求 编写一个WPF应用程序 利用数据并行计算两个矩阵 M N和N P 的乘积 得到一个M P的矩阵 1 在代码中用多任务通过调用某方法实现矩阵并行运算 在调用的参数中分别传递M N P的大小 2 程序中至少要测试3次有代
  • php7.3 "continue" targeting switch is equivalent to "break"

    php 7 3 版本导入Excel时报错 continue targeting switch is equivalent to break Did you mean to use continue 2 解决办法找到报错位置 将continu
  • interface{}类型通过json.Unmarshal之后的类型

    一句话总结 所有JSON数值类型一律解析为float64类型 需手动转换 对于map类型需判断是否为nil再转换为所需类型 interface 类型在json Unmarshal时 会自动将JSON转换为对应的数据类型 JSON的boole