gorm datatypes.JSON用法与json.RawMessage读取前端传去的json数据存数据库

gorm中正确的使用json数据类型 JSON。 阅读详情
AI摘要

本文探讨了在Go中使用gorm库处理JSON类型数据的问题。当存储JSON到数据库时,顺序变化导致前端展示不一致。解决方案是使用json.RawMessage,它保持原始JSON顺序。datatypes.JSON实际上是对json.RawMessage的封装,可以直接用于数据库存储,避免顺序问题。然而,即使使用datatypes.JSON,由于JSON协议规定,对象属性顺序并不保证,最终存储仍可能改变顺序。但使用datatypes.JSON简化了JSON数据到数据库的流程。

一 datatypes.JSON

  • 这个类型可以直接在模型中定义, 与 mysql数据库中的 json类型适配。 可以采用gorm的方法,实现json数据的存储。

二 json.RawMessage

  • 第一点用法可以参照这篇文章:https://xiuxiuing.blog.youkuaiyun.com/article/details/98059950

  • 第二点: 这里涉及到一个使用场景: 一个模型数据库表, 这个模型可能是飞机模型,汽车模型等等。 他们可能有公共字段,比如型号,生产厂家。 但是其他的一些详细配置参数不是固定的。所以数据库没法建立字段。 所以就直接存一个json进数据库。 但是我操作后,存进去的json和原来的json,里面元素顺序不对了,这样前端再展示的时候,也没顺序了

  • 我之前采用的做法就是 数据库字段定义为 datatypes.JSON(gorm)。 想直接把这个json对象存入数据库。 然后采用的gin框架。设置的结构体字段为 interface{}。 然后 1. BindJSON()接收, 然后再2. json.marshal,将转换后的结果赋值给 模型(字段类型就是datatypes.JSON) 存入数据库。 但是这样以转化 json对象的字段顺序就变了。 等把数据库存的 json对象返回给前端,遍历的时候里面属性的顺序就变了。

    • 提出问题:我很疑惑,底层怎么处理的。 我看了下,gin 框架的 BindJSON() 方法,底层也是调用,http 封装好的 request.Body, 然后绑定数据。 我想存的就是 json类型。 难道就不能拿到前端的数据直接存吗?(直接存应该就不会改变了)。 我现在都是用 空接口去 接收 body中的 json数据,再序列化为 json(其实看到 gorm的 json类型就是 []byte), 存入数据库。
    • json数据必须转为 go类型,再序列化才能存, 不是多消耗时间和性能吗?
    • 解答 :转为go的结构体,这样可以对传递的json数据格式进行校验,确保了数据的正确性。 但是想上述的场景中是不能定义出具体的结构体的,通过interface来做转化。
    • 解答:下面引出重点josn.RwaMessage
      • 于是我开始想, 利用 []byte 类型去接收json数据, 那么直接存,就不会乱序了,但是会提示报错, 不能将数据序列化到 []byte 类型的结构当中。也就是没有提供序列化的方法。
      • 官方的json模块, 提供了 json.RwaMessage 方法:
        在这里插入图片描述
      • 下面是具体的方法实现:也很简单的实现。
        在这里插入图片描述
      • 因为具有了这两个方法, 所以用json.RawMessage来代替 空接口类型来接收前端传递的json数据, 此时调试可以发现,获取到的就是传递的原数据,并没有出现乱序!而datatypes.JSON类型的实现,底层其实也是 []byte, 并且就是一个 json.RawMessage类型
        在这里插入图片描述
      • 那么可以直接使用 datatypes.JSON(data), 做类型转换, 此时存入数据库中,就不会出现乱序的情况,存储的是原来的数据。这样就解决了问题。
  • (更新):上面的datatypes.JSON实际上就是封装的 json.RawMessage。并且同样实现了两个方法,调用的还是 josn.RwaMessage 的方法:
    在这里插入图片描述

    • 所以可以直接全部用 datatypes.JSON来接收 前端传递的json数据。
  • (继续更新):今天又尝试写了一个 update更新接口, 全程采用 datatypes.JSON类型,发现从接收到传递给服务,一直顺序都没变,但是最后存入数据库,还是变了,看来这个和json的协议规定有关, json对象就不是有序的。 不过不是没有收获, 使用datatypes.JSON类型直接存json数据到数据库,方便省事。 除非有定义专门的结构体,做序列化和其他操作,不然直接用datatypes.JSON类型存json,方便。

gorm框架支持mysql json类型 摘自:http://www.itrensheng.com/archives/golang_gorm_implement golang 使用 redis \ kafka \ gorm 值得一看 mysql在5.7版本中已经开始支持json数据类型,但是目前gorm还不支持json类型,如下建表语句,定义query_param为json类型, CREATE TABLE `report` ( `id` bigint(20) NOT NULL, `query_param`... 阅读详情

相关推荐

数据类型:GORM自定义数据类型集合

GORM数据类型 JSON格式 sqlite,mysql,postgres支持 import "gorm.io/datatypes" type UserWithJSON struct { gorm. Model Name string Attributes datatypes. JSON } DB. Create ( & User { Name : "json-1" , Attributes : datatypes . JSON ([] byte ( `{"name": "jinzhu", "age": 18, "tags": ["tag1", "tag2"]

MySQL8.0学习笔记(11)——datatypes

文章目录数值类型INTFLOAT、DOUBLE 和 DECIMAL 类型字符串类型CHAR 和 VARCHAR 类型TEXT 和 BLOB 类型日期和时间类型DATE、TIME 和 TEAR 类型DATEYIME 和 TIMESTAMP 类型复合类型ENUM 类型SET 类型JSON更新json选择json数据修改或添加json单一键值对删除一个键值对 数值类型 MySQL 的数值类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数。许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同

qq_37863891的博客 1055

go-json-datatypes:获取给定值的 JSON 数据类型

go-json-数据类型 -- 导入“github.com/segmentio/go-json-datatypes” 获取给定值的 JSON 数据类型。 例子 package main import "github.com/segmentio/go-json-datatypes" import "fmt" func main () { fmt . Println ( Datatype ( "hello world" )) // String fmt . Println ( Datatype ( 15 )) // Number fmt . Println ( Datatype ([] string { "hello" })) // Array // .. } 执照 麻省理工学院

gorm框架使用pgsql过程种的问题记录

pgsql使用json或数组类型的参数

weixin_39735548的博客 1946

Keil5编译报错:ARM Compiler Version 5缺失的完整解决方案

本文提供了Keil5编译报错“ARM Compiler Version 5缺失”的完整解决方案。详细介绍了手动安装ARM Compiler Version 5的步骤,包括下载安装包、配置编译器路径及常见问题排查,帮助开发者快速恢复老项目的编译环境。

bb456的博客 945

CAN总线开发必看:报文发送类型全解析(含Cycle/Event/CE/IfActive对比)

本文深入解析CAN总线开发中的四种报文发送类型(Cycle/Event/CE/IfActive),对比其核心特征与工程应用场景。通过典型ECU交互案例和决策矩阵,帮助开发者根据实时性、总线效率等需求选择最优方案,并详解信号发送模式与恢复机制,提升车载网络通信可靠性。

weixin_30632089的博客 310

json: cannot unmarshal string into Go value of type xxx

这种方法应该是想着传入的类型是原始类型的数据,这样先序列化再反序列化就能忽略原始类型的影响。但是传入的是已经序列化的[]byte就不可以了。问题还是主要出在如果对[]byte类型的数据进行序列化,会生成字符类型的乱码。这里在testJSON序列化json时,先将参数序列化为jsonScore,再将其反序列化回原始值。这样可能想的是忽略接口原始传入的值类型,正常序列化。但是debug时发现,进入该函数时已经将原始值当做了 []uint8 类型。今天在工作时,遇到了一个json序列化问题。

qq_57123434的博客 1746

linux redis7 完整的集群搭建过程

一。安装: 1.1 说明: Redis官方只提供了源码,并没有提供经过编译之后的安装包。 因此,安装Redis,要先编译、后安装。(即源码安装方式) 注意:需要联网安装 1.2 安装编译的工具: yum install gcc gcc-c++ -y 1.3 下载tar包,上传到linux服务器,解压配置环境变量 1.4 cd +解压的目录下:编译 make 注意:如果编译失败,请重新进行解压编译,...

m0_38028438的博客 719

简单记录下gorm中存储json

【代码】简单记录下gorm中存储json。

水痕 2233

python k线顶分型_【缠论】分型、笔的定义及其程序化

K线包含关系处理和分型的定义如果一个K线的高低点全在另一K线的范围里,称之为包含关系。针对这种K线,需要进行一些处理,去除包含关系,处理方法:向上时,把两K线的高点当高点,而两K线低点中的较高者当成低点;反之,当向下时,把两K线的低点当低点,而两K线高点中的较低者当成高点,这样就把两K线合并成一新的K线。经过这样的处理,所有K线图都可以处理成没有包含关系的图形。两K线的包含关系,可以分成四种:1)...

weixin_39717152的博客 2823

避坑指南:你的VASP CI-NEB计算为什么不收敛?常见错误分析与解决思路

本文深入解析VASP CI-NEB计算不收敛的常见问题,提供从结构准备到参数设置的系统解决方案。针对过渡态计算中的能量曲线异常、中间图像偏离等典型问题,详细介绍了诊断方法和实用工具,帮助研究者高效解决CI-NEB收敛难题,提升计算效率。

weixin_29698641的博客 430

推荐开源项目:Go-GORM Datatypes - 数据类型扩展库

推荐开源项目:Go-GORM Datatypes - 数据类型扩展库 是一个针对 GORM ORM(对象关系映射)框架的扩展库,它为 Go 语言提供了更多的数据类型支持,以满足在数据库操作中更丰富的场景需求。 项目简介 GORM 是一款流行的 Go 语言 ORM 库,它简化了与 SQL 数据库的交互。然而,标准的 GORM 可能无法满足所有开发者的数据类型需求。Go-GORM Datatypes ...

gitblog_00089的博客 813

《YOLOv8-seg改进》专栏指导书册 &手把手创新教程

学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研;1)手把手教你如何训练YOLOv8-seg;2)模型创新,提升分割性能;3)独家自研模块助力分割;

会AI的学姐 3808

GO GORM & JSON

GORM 是一个在 Go 语言中广泛使用的 ORM(对象关系映射)库,提供了对数据库的操作和管理,使得开发者可以更方便地进行数据库操作。GORM 支持主流的数据库,如 MySQL、PostgreSQL、SQLite 和 SQL Server。将 GORM 与 JSON 结合使用,可以方便地在 Web 应用中处理数据。例如,使用 GORM 从数据库中查询数据并将其转换为 JSON 格式返回给客户端,或者从客户端接收 JSON 数据并保存到数据库中

GitHub个人仓库地址:https://github.com/feiyuluoye ; 个人塔罗牌占卜平台:http://118.126.82.12:8080/ ; 欢迎广大Coding友共同交流讨论。 2589

知识图谱:综述

第一种理解:知识图谱本质上是语义网络。本体论是语义网络中最重要的一个要素。第二种理解:知识图谱也叫做多关系图,由多种类型的节点和多种类型的边组成。课程以第二种理解为主。

u013250861的博客 478

学习STM32的ADC采集声音

为了采集声音信号,需要一个声音传感器(如麦克风),将声音信号转换为电压信号输入到 ADC 引脚。通过硬件准备、STM32CubeMX 配置和代码实现,我们可以实现将声音信号转换为数字信号,并进行后续处理。STM32 是一款广泛应用于嵌入式系统开发的微控制器平台,其拥有丰富的外设和强大的性能,非常适合进行 ADC(模拟数字转换)的声音采集。函数启动 ADC1 的连续转换模式,然后在一个无限循环中等待 ADC 转换完成,并读取采样结果。四、代码实现 在生成的代码中,会生成一些相关的库文件和示例代码。

m0_75244442的博客 2173

GORM 自定义数据类型json-切片(数组)

数据空中很多情况下数据是多变的,我们这篇文章将以json和数组为例学习GORM的自定义数据类型方法。自定义的数据类型必须实现Scanner和Valuer接口,以便让 GORM 知道如何将该类型接收、保存到数据库通过两个接口将json、数组转换为字符串类型,其实际为序列化和反序列化的过程// Info json的序列化与反序列化的实例,定义Info的信息,方便后续进行转化及查询// User 定义User表,表中的Info字段想要传入的即为json类型的数据。

kingsill的博客 3127

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

探索数据类型的优雅管理:GORM Data Types 深度解析

探索数据类型的优雅管理:GORM Data Types 深度解析 在追求高效、灵活的数据库操作过程中,GORM Data Types 为Go语言开发者提供了一套强大的解决方案。本文旨在深度剖析这一开源项目,展示其如何简化复杂的数据库交互,特别是在处理JSON、日期和时间类型时的独特魅力,以期吸引更多开发者加入其使用者行列。 项目介绍 GORM Data Types是GORM ORM库的一个扩展,专...

gitblog_00440的博客 1204

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

go处理json map

funcJsonToMapDemo(){ json_str:="{\"device\":{},\"data\":[{\"humidity\":27,\"time\":\"2017-07-0315:23:12\"}]}" m:=make(map[string]interface{}) json.Unmarshal([]byte(json_str),&m) fmt.Println(reflect.TypeOf(m["device"])...

liu0808的专栏 462

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

gorm字段类型设置成map

一开始我的结构体是这样的。 type AddRuleForm struct { Name string Cluster string Alert string Rule string Expr string For string Labels map[string]string Annotations map[string]string Desc string } 想把一个字段设置成 m

runzhliu大数据/容器日记 1992

在gorm中如何支持Json字段(结构体字段)和数组字段的模型迁移

如果我们只使用一张表来存储这个Blog数据结构的话,通常的做法是使用Json类型和数组类型的字段来存储。 目前Mysql和Postgresql的新版都已支持Json类型和数组类型。 本文所使用的数据库是Postgresql,具体版本不影响,Mysql的话可能需要新版的 可是在gorm里面我们直接将这个结构体进行模型迁移的话,会遇到不少问题!

weixin_51507240的博客 6172

GO处理MySQL JSON的三种方案,你选哪个?

但实际上,自从 MySQL 5.7 官方不再维护后,MySQL 8.x 版本中,JSON 字段的功能和性能已经不可同日而语了。如果我们还在用老一套的“字符串一把梭”,不仅浪费了数据库的能力,还给代码埋下了隐患。方案B (Datatypes.JSON):GORM 明确知道这是 JSON,会自动映射为数据库的最佳 JSON 类型。大家好,最近在维护一些先人写的代码时,发现很多先人在处理 MySQL 的JSON 字段时,习惯性地用。(元数据):结构动态,使用方案 B,保留灵活性,同时支持 JSON 查询。

kevin_tech的博客,微信搜「网管叨bi叨」 765

经典逻辑题--谁最富

推荐专栏《10天学会使用asp.net编程AI大模型》,目前已完成所有内容。

借雨醉东风的博客 948

gorm存储json

如果您已经为模型定义了指定的方法,它会在创建、更新、查询、删除时自动被调用。每次进行类似的操作都需要进行转换,十分的繁琐。序列化方法将需要存储的对象转化为json字符串,然后再存入mysql中。在一些存储配置文件的场景下,我们需要在mysql中存储json。这是我们在使用时直接操控Config即可完成操作,不需要再将数据进行转换。Hook 是在创建、查询、更新、删除等操作之前、之后调用的函数。以上面的操作为例,我们可以为其添加钩子函数,并修改结构体。gorm提供了钩子函数,可以很好的解决这个问题。

小熙的博客 758

GORM Customized Data Types 常见问题解决方案

GORM Customized Data Types 常见问题解决方案 基础介绍和主要编程语言 GORM Customized Data Types 是一个开源项目,它是为 GORM 数据库框架提供自定义数据类型支持的项目。GORM 是一个流行的 Go 语言 ORM(对象关系映射)库,它简化了与数据库的交互。这个项目主要使用 Go 语言开发,扩展了 GORM 的功能,允许开发者定义和使用自定义数据...

gitblog_00398的博客 949

小白新手村冒险之对象传递:对象的JSON序列化

尽管json.dumps和在不同编程语言中有不同的默认行为和细节差异,但它们的主要功能是将数据结构序列化为JSON字符串。理解这些差异对于在不同语言之间进行有效的数据交换和处理至关重要。通过掌握这些工具,开发者可以更高效地处理跨语言的数据交互。

airCyan_的博客 592
上一篇: 学习随笔:ubuntu18.04-server版本安装及配置go环境及vscode,goland远程连接及gitlab秘钥配置及postman下载
下一篇: 时区的区别及go语言的time库
我是py呀
博客等级 码龄8年 205粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值