V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  qW7bo2FbzbC0  ›  全部回复第 5 页 / 共 72 页
回复总数  1430
1  2  3  4  5  6  7  8  9  10 ... 72  
133 天前
回复了 qW7bo2FbzbC0 创建的主题 Go 编程语言 被 go 语言的 json.Marshal 恶心到了
139 天前
回复了 qW7bo2FbzbC0 创建的主题 Go 编程语言 被 go 语言的 json.Marshal 恶心到了
@lambdaq 和强弱类型没有关系,驱动底层逻辑问题
139 天前
回复了 qW7bo2FbzbC0 创建的主题 Go 编程语言 被 go 语言的 json.Marshal 恶心到了
@all mysql driver 还有这个问题,int 正常,但是 string 还是 base64 encode 字符串,json.RawMessage 也不顶用。sqlite3 的驱动是正常的
139 天前
回复了 qW7bo2FbzbC0 创建的主题 Go 编程语言 被 go 语言的 json.Marshal 恶心到了
另外 sqlx 最新版本也修复了 map[string]interface{}返回 base64 encode 字符的问题
140 天前
回复了 qW7bo2FbzbC0 创建的主题 Go 编程语言 被 go 语言的 json.Marshal 恶心到了
@james122333 您是对的,这的确和 json.Marshal 没关系,是 go-mysql-driver 的问题。

https://github.com/go-sql-driver/mysql/pull/1424
140 天前
回复了 qW7bo2FbzbC0 创建的主题 Go 编程语言 被 go 语言的 json.Marshal 恶心到了
各位,我比对了下,[]interface{}没有被 json.Marshal 出正确的数值和类型,是与我用的 go-mysql-driver 版本有关。

1.6.0 版本是出现了与我预测不同的结果。1.8 版本出现了预测的结果

json.Marshal 可能与本次贴文无直接关系。

另外,我觉得问题出自 json.Marshal 是从这个 sof 链接中的评论得到的错误推论,的确有迷惑性( https://stackoverflow.com/questions/34089750/marshal-byte-to-json-giving-a-strange-string)


```
This is because some idiot Millennial at Google decided it. Breaking the behaviour the RFC their JSON impl claims to follow defines. Check stackoverflow.com/a/78662958/3768429 for details.
```

该文指出 json.Marshal 处理 uint8[]时,错误输出了文字, 验证代码如下
```
func main() {
var x = []uint8{1, 2, 3, 4, 5, 6}
var y = []int8{1, 2, 3, 4, 5, 6}
xBytes, err := json.Marshal(x)
if err != nil {
panic(err)
}
yBytes, err := json.Marshal(y)
if err != nil {
panic(err)
}
fmt.Println(fmt.Sprintf("uint8 %s, int8: %s", string(xBytes), string(yBytes)))
}
```
输出的结果为
```
uint8 "AQIDBAUG", int8: [1,2,3,4,5,6]
```

https://go.dev/play/p/KGNG6voRuDk
140 天前
回复了 qW7bo2FbzbC0 创建的主题 Go 编程语言 被 go 语言的 json.Marshal 恶心到了
@fregie 你满意就好
140 天前
回复了 qW7bo2FbzbC0 创建的主题 Go 编程语言 被 go 语言的 json.Marshal 恶心到了
按楼上说的 json.RawMessage 解决了,我没有想到要去 json 命名空间里找类型
@leonshaw
140 天前
回复了 qW7bo2FbzbC0 创建的主题 Go 编程语言 被 go 语言的 json.Marshal 恶心到了
@fregie 犯懒字面上是贬义词吧,你觉得不是攻击性的,那你可以自己多读几遍,不要替别人做决定。稳定不稳定不知道,写起来麻烦的代码后面维护起来肯定更麻烦
140 天前
回复了 qW7bo2FbzbC0 创建的主题 Go 编程语言 被 go 语言的 json.Marshal 恶心到了
@lifei6671 1.8 之前还有什么办法避免 Interface 满天飞?
140 天前
回复了 qW7bo2FbzbC0 创建的主题 Go 编程语言 被 go 语言的 json.Marshal 恶心到了
@vczyh 你这个是什么驱动?
140 天前
回复了 qW7bo2FbzbC0 创建的主题 Go 编程语言 被 go 语言的 json.Marshal 恶心到了
@ScepterZ 是的,我说错了,是 go/sql 返回的 interface 无法直接序列化
140 天前
回复了 qW7bo2FbzbC0 创建的主题 Go 编程语言 被 go 语言的 json.Marshal 恶心到了
@james122333 json.RawMessage 是可行的,但是看起来和 java/c#的模式不同,从 go/sql 映射出来的 interface 变成了[]byte 而不是(interface).type ,而且官方文档好像也推荐用 interface 或者 sql.RawBytes 来接未知类型
140 天前
回复了 qW7bo2FbzbC0 创建的主题 Go 编程语言 被 go 语言的 json.Marshal 恶心到了
同样是使用匿名类型去序列化,java 也正确识别出了 Number 类型
```java
package com.test.Demo;

import java.sql.*;
import java.io.*;
import java.util.*;
import com.google.gson.*;

public class Demo {
static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
static final String DB_URL = "jdbc:mysql://127.0.0.1:3306/test?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";
static final String USER = "root";
static final String PASS = "******";

public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try{
Class.forName(JDBC_DRIVER);
conn = DriverManager.getConnection(DB_URL,USER,PASS);
stmt = conn.createStatement();
String sql = "select id from t1";
ResultSet rs = stmt.executeQuery(sql);
HashMap<String, Object> x;
x = new HashMap<String, Object>();

while(rs.next()){
Object id = rs.getObject("id");
x.put("name", "name");
x.put("value", id);
}
Gson gson = new Gson();
System.out.println(gson.toJson(x));
} catch (Exception e){
e.printStackTrace();
}

}

}

```
140 天前
回复了 qW7bo2FbzbC0 创建的主题 Go 编程语言 被 go 语言的 json.Marshal 恶心到了
同样是使用匿名类型去序列化,c#正确识别出了 Number 类型

```c#
// See https://aka.ms/new-console-template for more information
using System.Text.Json;
using MySqlConnector;


using var connection = new MySqlConnection("Server=127.0.0.1;User ID=root;Password=****;Database=test");
connection.Open();

using var command = new MySqlCommand("select id from t1;", connection);
using var reader = command.ExecuteReader();
var x = new Dictionary<string, object> { };
while (reader.Read())
{
x["name"] = "name";
x["value"] = reader.GetValue(0);
}
Console.WriteLine(JsonSerializer.Serialize(x));
```

输出结果为

```js
{"name":"name","value":1}
```
140 天前
回复了 qW7bo2FbzbC0 创建的主题 Go 编程语言 被 go 语言的 json.Marshal 恶心到了
@fregie 1 、项目定型是这个语言。2 、类似的蹩脚问题不止这一个,在 go1.8 之前代码里面好多 inteface 飞来飞去,不仅丢失了类型还影响类型安全。 我讨厌 interface 转来转去也是犯懒,我觉得 go/sql 和 json.Marshal 对于匿名类型查询不友好也是犯懒?你扣帽子是什么态度?
140 天前
回复了 qW7bo2FbzbC0 创建的主题 Go 编程语言 被 go 语言的 json.Marshal 恶心到了
140 天前
回复了 qW7bo2FbzbC0 创建的主题 Go 编程语言 被 go 语言的 json.Marshal 恶心到了
https://forum.golangbridge.org/t/json-encode-byte-array-as-hex-string-instead-of-base64/26751

```
One must use reflection to walk and copy the original object replacing byte arrays with the user-defined type for which the MarshalJSON method is defined, but there’s probably no better way. An even uglier alternative is to post-process the JSON.
```
140 天前
回复了 qW7bo2FbzbC0 创建的主题 Go 编程语言 被 go 语言的 json.Marshal 恶心到了
在 go/sql 中,interface 或者 any 会返回[]byte ,在 json.Marshal 中,[]byte 会被序列化成 base64 encode 字符串


`Array and slice values encode as JSON arrays, except that []byte encodes as a base64-encoded string, and a nil slice encodes as the null JSON value.`

@NessajCN @sagaxu
1  2  3  4  5  6  7  8  9  10 ... 72  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1078 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 27ms · UTC 19:18 · PVG 03:18 · LAX 11:18 · JFK 14:18
Developed with CodeLauncher
♥ Do have faith in what you're doing.