首页 > 其他分享 >golang 处理未确定json字符串

golang 处理未确定json字符串

时间:2024-01-17 16:02:06浏览次数:37  
标签:map struct 未确定 golang interface json 字符串

json字符串转golang map

我们知道golang处理json字符串时,需要先转成struct,并且struct必须是确定的。
有时候我们传递的json是不固定的,针对每种情况都写一个struct比较麻烦,有没有处理不确定json的方法呢?
答案是有的

	var a string = "{\"a\":1,\"b\":\"xx\"}"
	var b map[string]interface{}
	err := json.Unmarshal([]byte(a), &b)
	if err != nil {
		log.Println(err)
		return
	}

如上面的示例,a是一个json字符串,b就是用来接收json字符串的map,其key是string,value是interface。
这样反序列化就可以把json字符串映射成一个golang的map,用起来与struct一样。

判断map中key是否存在

因为json字符串是不确定的,所以我们会用到判断某个key是否在map中,其方法如下

	if _, ok := b["a"]; ok {
		log.Println(b["a"])
	}

如果有a,ok是true;如果没有a,ok是false。

判断value类型

既然json字符串不固定,key确认是否存在了,还需要确认value的类型。

if reflect.TypeOf(b["a"]).Kind() == reflect.Float64 {
}

golang会把数字转成float64,默认按照最大的存储数字转换,避免数据丢失。reflect.TypeOf用来获取数据类型,获取的是一个结构体,Kind函数获取具体的类型。reflect.Float64是系统定义的类型,常见的类型都有,包括map,string等。

value数据转换

通过b["a"]获取的是interface,因为本身我们的map就是interface。
赋值的时候可能会遇到类型转换,比如把float64转成int,如果直接用常见的int(b["a"])会报错
需要先用b["a"].(float64)转成对应的数据,再进行int(b["a"].(float64))转换。
能否用b["a"].(int)直接转换?答案是不可以。golang对类型限制的比较严,会报错。
https://stackoverflow.com/questions/35583735/unmarshaling-into-an-interface-and-then-performing-type-assertion
https://pkg.go.dev/encoding/json#Unmarshal

标签:map,struct,未确定,golang,interface,json,字符串
From: https://www.cnblogs.com/studywithallofyou/p/17970215

相关文章

  • ObjectMapper工具类 json字符串和 对象之间转换。和对于 ObjectMapper的一些可选设置
    ObjectMapper工具类json字符串和对象之间转换。和对于ObjectMapper的一些可选设置。添加maven依赖<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.13.3</version> </d......
  • 以 Golang 为例详解 AST 抽象语法树
    前言各位同行有没有想过一件事,一个程序文件,比如hello.go是如何被编译器理解的,平常在编写程序时,IDE又是如何提供代码提示的。在这奥妙无穷的背后,AST(AbstractSyntaxTree)抽象语法树功不可没,他站在每一行程序的身后,默默无闻的工作,为繁荣的互联网世界立下了汗马功劳。AST抽象......
  • 解决 Idea HttpClient 无法读取 http-client.env.json 配置的问题
    前言byd就我遇到了这种情况是吧,百度搜的全是nm复制粘贴的垃圾文章步骤创建一个.http文件,使用idea工具栏创建一个env.json,内容无所谓按理说现在应该就能正常使用了,但是如果到这一步还没法读取到这个环境的话,继续向下看右键env.json看看有没有这个,如果没......
  • JSON注解自定义格式解析
    在SpringBoot中,你可以通过自定义注解来格式化或转换属性值。以下是一个示例代码,演示如何实现这个过程:首先,定义一个注解@CustomFormat,用于标注需要格式化或转换的属性。该注解可以包含一个参数,用于指定格式化或转换的方式。importjava.lang.annotation.*;@Target(ElementType......
  • Golang实现程序优雅退出的方法 有哪些 ?
    Golang实现程序优雅退出的方法有哪些?原创磊丰Go语言圈2024-01-1608:31发表于广东听全文学习与交流:Go语言技术微信群商务合作加微信:LetsFeng   现在就开始你的Go语言学习之旅吧!人生苦短,let’sGo.      Goland全家桶激活码,永久有效,亲测可用,限时免......
  • 在Linux下, 不使用包管理器安装Golang sdk
    尝试从targz安装go下面这个是go官网的,注意使用代理下载;wgethttps://go.dev/dl/go1.21.6.linux-amd64.tar.gztar-zxvfgo1.13.1.linux-amd64.tar.gzmvgo//usr/local/将go添加到环境变量:确实fishshell是这样设置环境变量的吗?vim/etc/profile加入以下内容:e......
  • csharp c# http request get post put delete header respons json 网络请求
    C#中如何模拟一个post请求使用HttpClient代替。以下是修改后的代码示例:usingSystem;usingSystem.Net.Http;usingSystem.Text.Json;classHttpPostExample{privateasyncTask<string>HttpPost(stringUrl,objectpostData){stringpostDataStr=J......
  • python中json.dumps() 与json.dump(),json.load()与json.loads()区别?
    json.dumps()将Python对象转换为JSON字符串,并返回该字符串。而json.dump()将Python对象转换为JSON字符串,并将该字符串写入文件。json.dumps()接受一个Python对象作为参数,而json.dump()接受两个参数:一个Python对象和一个写入数据的文件对象。json.dump()生......
  • 前端跨域三种解决方式(CORS、JSONP、代理跨域)
    什么是跨域?跨域是浏览器为了安全而作出的限制策略(所以服务端不涉及到跨域);浏览器请求必须遵循同源策略,即同域名、同端口、同协议;例如:http://www.abc.com到http://www.def.com的请求会出现跨域(域名不同)http://www.abc.com:3000到http://www.abc.com:3001的请求会出现跨域(端口不同......
  • Chrome 插件 V3 版本 Manifest.json 中的内容脚本(Content Scripts)解析
    内容脚本(ContentScripts)指定在用户打开某些网页时要使用的JavaScript或CSS文件。内容脚本是在网页环境中运行的文件。通过使用标准文档对象模型 (DOM),开发者能够读取浏览器所访问网页的详情、更改这些网页,并将信息传递给其父级扩展程序。一、内容脚本功能内容脚本在......