GOLANG 中复杂 JSON 解析

本贴最后更新于 2926 天前,其中的信息可能已经时移世改

在使用 golang 的时候, 很烦处理 json 数据, 感觉问题不断啊
so: 记录在此, 以便查看 ~

在 encoding/json 包下有提供的方法: Unmarshal
文档中是这样描述的:

Unmarshal函数解析json编码的数据并将结果存入v指向的值。 Unmarshal和Marshal做相反的操作,必要时申请映射、切片或指针,有如下的附加规则: 要将json数据解码写入一个指针,Unmarshal函数首先处理json数据是json字面值null的情况。此时,函数将指针设为nil;否则,函数将json数据解码写入指针指向的值;如果指针本身是nil,函数会先申请一个值并使指针指向它。 要将json数据解码写入一个结构体,函数会匹配输入对象的键和Marshal使用的键(结构体字段名或者它的标签指定的键名),优先选择精确的匹配,但也接受大小写不敏感的匹配。 要将json数据解码写入一个接口类型值,函数会将数据解码为如下类型写入接口: Bool 对应JSON布尔类型 float64 对应JSON数字类型 string 对应JSON字符串类型 []interface{} 对应JSON数组 map[string]interface{} 对应JSON对象 nil 对应JSON的null 如果一个JSON值不匹配给出的目标类型,或者如果一个json数字写入目标类型时溢出,Unmarshal函数会跳过该字段并尽量完成其余的解码操作。如果没有出现更加严重的错误,本函数会返回一个描述第一个此类错误的详细信息的UnmarshalTypeError。 JSON的null值解码为go的接口、指针、切片时会将它们设为nil,因为null在json里一般表示“不存在”。 解码json的null值到其他go类型时,不会造成任何改变,也不会产生错误。 当解码字符串时,不合法的utf-8或utf-16代理(字符)对不视为错误,而是将非法字符替换为unicode字符U+FFFD。

大多时间开发中会用到解析 json string 到 struct 便与管理和调用

json:

{ "style": 3, "color": "black", "width": 300, "height": 200 }

go

type BoxStruct struct { Style int Color string Width float64 Height float64 } var box BoxStruct if err := json.Unmarshal([]byte(jsonStr), &box); err == nil { fmt.Println("%+b", box) }

这个只是简单的 json 与 struct 的转换, 往往在处理的时候, 这个 box 并不是 box, 而是 boxes 只需要其声明为数组即可

var boxes []BoxStruct

前段时间开发过程中, 还遇到了一个极为复杂的 json 结构处理, 数据结构大概是这样:

{ "box-count-6572615": { "style": 1, "sample": [ { "pic": "filenamebox-count-6572615", "title": "yaoyi", "entitle": "", "describe": "", "describePic": null, "coordinate": [ { "X": 55.033557046979865, "Y": 33.63095238095239, "title": "yaoyi", "content": "yaoyi" } ] }, { "pic": "filename2box-count-6572615", "title": "yaoyi", "entitle": "", "describe": "", "describePic": null, "coordinate": [ { "X": 59.06040268456376, "Y": 39.88095238095239, "title": "yaoyi", "content": "yaoyi" } ] } ] }, "box-count-6605461": { "style": 2, "sample": [ { "pic": "filenamebox-count-6605461", "title": "yaoyi", "entitle": "", "describe": "", "describePic": "describefilebox-count-6605461", "coordinate": [ { "X": 48.821548821548824, "Y": 51.78571428571429, "title": "yaoyi", "content": "yaoyi" } ] } ] } }

注意 JSON 的 key 值不是固定值 那么

map[string]interfalce{}

是跑不了了, 其结构就为 map[ string: struct{ array[ struct{} ] } ]
将其拆解为独个的 struct 然后组合起来
struct

type boxStruct struct { Style int `json:"style"` Sample []sampleStruct `json:"sample"` } type sampleStruct struct { Pic string `json:"pic"` Title string `json:"title"` Entitle string `json:"entitle"` Describe string `json:"describe"` DescribePic string `json:"describePic"` Coordinate []coordinateStruct `json:"coordinate"` } type coordinateStruct struct { X float64 `json:"X"` Y float64 `json:"Y"` Title string `json:"title"` Content string `json:"content"` }

boxStruct 就是我们需要的结构体了

go

var boxes map[string]boxStruct if err := json.Unmarshal([]byte(jsonStr), &boxes); err == nil { fmt.Println("%+b", boxes) }

THE END.

from Green
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    498 引用 • 1395 回帖 • 254 关注
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    52 引用 • 190 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • zonghua via iPhone

    如果少了键是不是就直接返回错误的?

    1 回复
  • K
    作者

    并不会, 会变为 : 部分解析

  • xhaoxiong

    这是一个实用的工具 http://goolibs.com/tools

    1 回复
  • K
    作者

    已收藏〜 👍

K
暴风雨之后,不止没看到彩虹,还感冒了。 上海

推荐标签 标签

  • VirtualBox

    VirtualBox 是一款开源虚拟机软件,最早由德国 Innotek 公司开发,由 Sun Microsystems 公司出品的软件,使用 Qt 编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。

    10 引用 • 2 回帖 • 15 关注
  • Outlook
    1 引用 • 5 回帖 • 1 关注
  • Chrome

    Chrome 又称 Google 浏览器,是一个由谷歌公司开发的网页浏览器。该浏览器是基于其他开源软件所编写,包括 WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。

    62 引用 • 289 回帖
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    107 引用 • 153 回帖
  • Sandbox

    如果帖子标签含有 Sandbox ,则该帖子会被视为“测试帖”,主要用于测试社区功能,排查 bug 等,该标签下内容不定期进行清理。

    431 引用 • 1250 回帖 • 599 关注
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 20 关注
  • abitmean

    有点意思就行了

    32 关注
  • Mobi.css

    Mobi.css is a lightweight, flexible CSS framework that focus on mobile.

    1 引用 • 6 回帖 • 757 关注
  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    91 引用 • 384 回帖
  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    586 引用 • 3538 回帖
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖 • 4 关注
  • 印象笔记
    3 引用 • 16 回帖
  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖 • 1 关注
  • Pipe

    Pipe 是一款小而美的开源博客平台。Pipe 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    133 引用 • 1124 回帖 • 118 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    20 引用 • 37 回帖 • 573 关注
  • IPFS

    IPFS(InterPlanetary File System,星际文件系统)是永久的、去中心化保存和共享文件的方法,这是一种内容可寻址、版本化、点对点超媒体的分布式协议。请浏览 IPFS 入门笔记了解更多细节。

    21 引用 • 245 回帖 • 229 关注
  • WebComponents

    Web Components 是 W3C 定义的标准,它给了前端开发者扩展浏览器标签的能力,可以方便地定制可复用组件,更好的进行模块化开发,解放了前端开发者的生产力。

    1 引用 • 8 关注
  • 安装

    你若安好,便是晴天。

    132 引用 • 1184 回帖
  • JetBrains

    JetBrains 是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是 Java 编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA

    18 引用 • 54 回帖
  • Quicker

    Quicker 您的指尖工具箱!操作更少,收获更多!

    36 引用 • 155 回帖
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    289 引用 • 4492 回帖 • 652 关注
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 83 关注
  • Shell

    Shell 脚本与 Windows/Dos 下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比 Windows 下的批处理更强大,比用其他编程程序编辑的程序效率更高,因为它使用了 Linux/Unix 下的命令。

    124 引用 • 74 回帖
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    29 引用 • 66 回帖
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 176 关注
  • 倾城之链
    23 引用 • 66 回帖 • 162 关注
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 59 关注