草庐IT

JSON 将数字视为 base64 golang

coder 2023-07-02 原文

尝试将查询输出作为 JSON 发送到浏览器,但数字被视为 Base64。整数打印正确。

 var rows *sqlx.Rows 
 enc := json.NewEncoder(w)

 rows, err = db.Queryx(query)
  for rows.Next() {
    results := make(map[string]interface{})
    err = rows.MapScan(results)
    if err := enc.Encode(results); err != nil{
       fmt.Fprintf(w,"%s\n", results)
    }
 }

JSON 的结果是 (id integer, qty numeric/float):

{"ID":1,"QTY":"OC4wMA=="}

{"ID":2,"QTY":"OC4wMA=="}

如果没有 JSON 编码,数字列将被正确视为数字。

编辑

@mkopriva 希望这个回答对您有所帮助:

“如果您提供表定义,以便我们可以看到该列是如何定义的,它也有助于查看 SQL 查询,以便我们可以看到您是如何从数据库中提取该列的”

"ID"  int4
"QTY" numeric 

SELECT * FROM table

如果您提供您提到的“将列正确视为数字”的代码及其输出,这也会有所帮助

var rows *sqlx.Rows 

rows, err = db.Queryx(query)
for rows.Next() {
  results := make(map[string]interface{})
  err = rows.MapScan(results)
  fmt.Fprintf(w,"%s\n", results)
}

给出这个结果:

map[ID:1 QTY:9.75]

map[ID:2 QTY:7.00]

“你能为我们执行 fmt.Printf("%T", results["QTY"]) 吗?如果“QTY”确实是 json 编码器将编码(marshal)的 int 或 float,则非常值得怀疑它作为 base64 字符串。

如果没有 JSON,这会给出:

[]uint8 []uint8

最佳答案

假设您使用的是 lib/pqQTY 值被转换为字节 slice ,这实际上是 正确的 类型相应的 postgres numeric 类型。这是因为 numeric 类型的值不能可靠地适合 float64 而不会丢失精度,因此驱动程序选择转换 postgres numeric 是有意义的 值转换为 Go []byte 值。

参见此处:https://github.com/lib/pq/issues/648#issuecomment-322674708

但是,您可以通过将类型 *float64 的 Go 值传递给 Scan 方法系列来明确告诉驱动程序您需要一个 float ,驱动程序将将 numeric 转换为 float64,在此过程中失去精度。但如果您传递一个接口(interface){},驱动程序将做出最合适的选择并将该值转换为字节 slice 。

如果您不关心精度,但必须使用 interface{} 作为 Scan 的参数,您可以将表列的类型从 更改为numericfloat,如果您这样做,那么驱动程序可以安全地选择将您的列转换为 Go float64

如果您关心精度,但出于某种原因您必须使用接口(interface)映射,您可以编写一个简单的函数,将映射中已知键的值从 []byte 转换为string,之后,当您将更新的映射传递给 json 编码器时,您会看到该键的值被编码为普通字符串而不是 base64。

func bytesToString(k string, m map[string]interface{}) {
    if b, ok := m[k].([]byte); ok {
        m[k] = string(b)
    }
}

https://play.golang.org/p/Ekih0oLd4-L

关于JSON 将数字视为 base64 golang,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49688892/

有关JSON 将数字视为 base64 golang的更多相关文章

  1. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

  2. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  3. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  4. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

  5. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  6. ruby-on-rails - 如何使用 Rack 接收 JSON 对象 - 2

    我有一个非常简单的RubyRack服务器,例如:app=Proc.newdo|env|req=Rack::Request.new(env).paramspreq.inspect[200,{'Content-Type'=>'text/plain'},['Somebody']]endRack::Handler::Thin.run(app,:Port=>4001,:threaded=>true)每当我使用JSON对象向服务器发送POSTHTTP请求时:{"session":{"accountId":String,"callId":String,"from":Object,"headers":

  7. 区块链之加解密算法&数字证书 - 2

    目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非

  8. ruby - 用 YAML.load 解析 json 安全吗? - 2

    我正在使用ruby2.1.0我有一个json文件。例如:test.json{"item":[{"apple":1},{"banana":2}]}用YAML.load加载这个文件安全吗?YAML.load(File.read('test.json'))我正在尝试加载一个json或yaml格式的文件。 最佳答案 YAML可以加载JSONYAML.load('{"something":"test","other":4}')=>{"something"=>"test","other"=>4}JSON将无法加载YAML。JSON.load("

  9. ruby - 将n维数组的每个元素乘以Ruby中的数字 - 2

    在Ruby中,是否有一种简单的方法可以将n维数组中的每个元素乘以一个数字?这样:[1,2,3,4,5].multiplied_by2==[2,4,6,8,10]和[[1,2,3],[1,2,3]].multiplied_by2==[[2,4,6],[2,4,6]]?(很明显,我编写了multiplied_by函数以区别于*,它似乎连接了数组的多个副本,不幸的是这不是我需要的)。谢谢! 最佳答案 它的长格式等价物是:[1,2,3,4,5].collect{|n|n*2}其实并没有那么复杂。你总是可以使你的multiply_by方法:c

  10. Ruby 的数字方法性能 - 2

    我正在使用Ruby解决一些ProjectEuler问题,特别是这里我要讨论的问题25(Fibonacci数列中包含1000位数字的第一项的索引是多少?)。起初,我使用的是Ruby2.2.3,我将问题编码为:number=3a=1b=2whileb.to_s.length但后来我发现2.4.2版本有一个名为digits的方法,这正是我需要的。我转换为代码:whileb.digits.length当我比较这两种方法时,digits慢得多。时间./025/problem025.rb0.13s用户0.02s系统80%cpu0.190总计./025/problem025.rb2.19s用户0.0

随机推荐