Golang 处理复杂格式JSON数据(多类型混合)

简介: Golang 处理复杂格式JSON数据(多类型混合)

补充


以下内容仅做学习参考,使用请使用以下网站获取相应返回JSON结构体:JSON 转 Golang Struct

起因


在调取百度人体检测接口时,返回的JSON数据嵌套了多层,解析为map[string]interface()类型的数据后,在遍历取值过程中出现了一些异常,如下两个等:

cannot range over person_info (type interface {})

interface conversion: interface {} is []interface {}, not map[string]interface {}

原始数据


以下为返回的JSON数据

{
    "person_num": 2,
    "person_info": [
        {
            "attributes": {
                "orientation": {
                    "score": 0.9992424249649048,
                    "name": "正面"
                },
                "gender": {
                    "score": 0.9216505289077759,
                    "name": "男性"
                }
            },
            "location": {
                "score": 0.9567705988883972,
                "top": 327,
                "left": 283,
                "width": 133,
                "height": 152
            }
        },
        {
            "attributes": {
                "orientation": {
                    "score": 0.9960677623748779,
                    "name": "正面"
                },
                "gender": {
                    "score": 0.9766052961349487,
                    "name": "女性"
                }
            },
            "location": {
                "score": 0.9070568680763245,
                "top": 339,
                "left": 488,
                "width": 90,
                "height": 139
            }
        }
    ],
    "log_id": 1471750893281891840
}

处理方式


在处理返回的JSON数据时,Golang需要用特定的数据类型去承接JSON的数据类型,具体如下:

序号 JSON 数据类型 Golang 数据类型
1 booleans bool
2 numbers float64
3 strings string
4 arrays []interface{}
5 objects map[string]interface{}
6 null nil

代码


以下为处理上面原始数据的一段示例,在原始数据中:person_num为numbers类型数据,所以转为float64;person_info为arrays类型,所以转为[]interface{}类型进行处理

  person_num := person["person_num"].(float64)
  person_info := person["person_info"].([]interface{})
  for _, val := range person_info {
    fmt.Println(reflect.TypeOf(val))
  }

参考: (type interface {})" data-link-title="Go cannot range over (type interface {})">Go cannot range over <my var> (type interface {})

目录
相关文章
|
29天前
|
JSON 前端开发 JavaScript
聊聊 Go 语言中的 JSON 序列化与 js 前端交互类型失真问题
在Web开发中,后端与前端的数据交换常使用JSON格式,但JavaScript的数字类型仅能安全处理-2^53到2^53间的整数,超出此范围会导致精度丢失。本文通过Go语言的`encoding/json`包,介绍如何通过将大整数以字符串形式序列化和反序列化,有效解决这一问题,确保前后端数据交换的准确性。
35 4
|
1月前
|
JSON JavaScript Java
对比JSON和Hessian2的序列化格式
通过以上对比分析,希望能够帮助开发者在不同场景下选择最适合的序列化格式,提高系统的整体性能和可维护性。
42 3
|
1月前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
1月前
|
JSON Java 数据格式
springboot中表字段映射中设置JSON格式字段映射
springboot中表字段映射中设置JSON格式字段映射
120 1
|
1月前
|
JSON 缓存 前端开发
PHP如何高效地处理JSON数据:从编码到解码
在现代Web开发中,JSON已成为数据交换的标准格式。本文探讨了PHP如何高效处理JSON数据,包括编码和解码的过程。通过简化数据结构、使用优化选项、缓存机制及合理设置解码参数等方法,可以显著提升JSON处理的性能,确保系统快速稳定运行。
|
1月前
|
JSON 人工智能 算法
探索LLM推理全阶段的JSON格式输出限制方法
文章详细讨论了如何确保大型语言模型(LLMs)输出结构化的JSON格式,这对于提高数据处理的自动化程度和系统的互操作性至关重要。
|
1月前
|
JSON API 数据安全/隐私保护
拍立淘按图搜索API接口返回数据的JSON格式示例
拍立淘按图搜索API接口允许用户通过上传图片来搜索相似的商品,该接口返回的通常是一个JSON格式的响应,其中包含了与上传图片相似的商品信息。以下是一个基于淘宝平台的拍立淘按图搜索API接口返回数据的JSON格式示例,同时提供对其关键字段的解释
|
3月前
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
140 4
Golang语言之管道channel快速入门篇
|
3月前
|
Go
Golang语言文件操作快速入门篇
这篇文章是关于Go语言文件操作快速入门的教程,涵盖了文件的读取、写入、复制操作以及使用标准库中的ioutil、bufio、os等包进行文件操作的详细案例。
71 4
Golang语言文件操作快速入门篇
|
3月前
|
Go
Golang语言之gRPC程序设计示例
这篇文章是关于Golang语言使用gRPC进行程序设计的详细教程,涵盖了RPC协议的介绍、gRPC环境的搭建、Protocol Buffers的使用、gRPC服务的编写和通信示例。
112 3
Golang语言之gRPC程序设计示例