JSON 解析错误:字符串无法反序列化为结构体类型的原因与解决方案

酷芳酱_9594

酷芳酱_9594

2026-09-29

102人浏览

原创

JSON 解析错误:字符串无法反序列化为结构体类型的原因与解决方案

本文解析 Go 中常见的 JSON 反序列化错误 “json: cannot unmarshal string into Go value of type main.test_struct”,核心原因在于前端以表单编码(x-www-form-urlencoded)方式发送数据,而非合法 JSON 格式,导致 Go 的 json.Decoder 试图将形如 lat=...&lng=... 的字符串解析为结构体而失败。

本文解析 go 中常见的 json 反序列化错误 “json: cannot unmarshal string into go value of type main.test_struct”,核心原因在于前端以表单编码(x-www-form-urlencoded)方式发送数据,而非合法 json 格式,导致 go 的 `json.decoder` 试图将形如 `lat=...&lng=...` 的字符串解析为结构体而失败。

该错误并非 Go 类型定义或 JSON 标签问题,而是请求内容格式与解码器预期严重不匹配所致。

从你提供的前端代码可见:

var params = {long: long, lat: lat};
$.ajax({
  type: 'POST',
  url: url_bis,
  data: params, // ← 关键:jQuery 默认将对象转为 x-www-form-urlencoded 字符串
  dataType: 'jsonp',
  // ...
});

此时实际发送的 HTTP 请求体是:

lat=48.892423&long=2.215331

⚠️ 注意:字段名是 long(非 lng),且缺少 acc;同时整个载荷是 URL 编码的键值对,不是 JSON 字符串。而你的 Go 服务却用 json.NewDecoder(r.Body).Decode(&t) 强制按 JSON 解析——这就像用 PDF 阅读器打开一个 TXT 文件,自然报错:“无法将字符串(lat=...)反序列化为 test_struct”。

Aria2 Json Rpc
Aria2 Json Rpc

通过 JSON‑RPC 2.0 与 aria2 下载管理器交互,使用自然语言命令管理下载、查询状态并控制任务。适用于 aria2、下载管理或种子操作。

下载

✅ 正确解决方案(二选一)

方案一:前端改为发送标准 JSON(推荐)

修改 JavaScript,显式构造 JSON 并设置请求头:

const payload = JSON.stringify({
  lat: data.location.lat,
  lng: data.location.lng,
  acc: 1962 // 或从其他来源获取
});

$.ajax({
  type: 'POST',
  url: url_bis,
  contentType: 'application/json; charset=utf-8', // ← 告诉后端这是 JSON
  data: payload,
  success: function(data2) {
    console.log(data2);
  }
});

方案二:后端适配表单数据(兼容旧逻辑)

若无法修改前端,改用 r.FormValue 或 r.ParseForm() 提取字段:

func postGeo(w http.ResponseWriter, r *http.Request) {
  if err := r.ParseForm(); err != nil {
    http.Error(w, "Invalid form data", http.StatusBadRequest)
    return
  }

  t := test_struct{}
  t.Lat = float32(parseFloat32(r.FormValue("lat")))
  t.Lng = float32(parseFloat32(r.FormValue("long"))) // 注意字段名是 "long"
  t.Acc = parseInt(r.FormValue("acc"))

  Info.Printf("Parsed: %+v", t)
  w.Header().Set("Access-Control-Allow-Origin", "*")
  fmt.Fprintf(w, "200")
}

// 辅助函数(生产环境建议用 strconv.ParseFloat + error 检查)
func parseFloat32(s string) float64 {
  f, _ := strconv.ParseFloat(s, 32)
  return f
}
func parseInt(s string) int {
  i, _ := strconv.Atoi(s)
  return i
}

? 验证与调试建议

  • 在 Go 中先打印原始请求体,确认真实格式:
    body, _ := io.ReadAll(r.Body)
    Info.Printf("Raw body: %s", string(body))
  • 永远检查 r.Header.Get("Content-Type"),区分 application/json 与 application/x-www-form-urlencoded。
  • 结构体字段标签需与实际 JSON key 严格一致(如 "lng" vs "long"),大小写敏感。

? 总结:Go 的 json.Unmarshal / json.Decoder 只接受合法 JSON 文本。当收到非 JSON 载荷(如表单、纯文本、XML)时,必须切换解析策略——切勿强行用 JSON 解码器“硬解”。明确前后端约定的数据格式,是避免此类错误的根本。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

js json

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

1995

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

2762

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

956

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

3099

7

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

2025.06.09

4074

18

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

2025.07.04

4231

25

Go中Type关键字的用法
Go中Type关键字的用法

Go中Type关键字的用法有定义新的类型别名或者创建新的结构体类型。本专题为大家提供Go相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.06

2389

5

go怎么实现链表
go怎么实现链表

go通过定义一个节点结构体、定义一个链表结构体、定义一些方法来操作链表、实现一个方法来删除链表中的一个节点和实现一个方法来打印链表中的所有节点的方法实现链表。

2023.09.25

4727

6

go语言编程软件有哪些
go语言编程软件有哪些

go语言编程软件有Go编译器、Go开发环境、Go包管理器、Go测试框架、Go文档生成器、Go代码质量工具和Go性能分析工具等。本专题为大家提供go语言相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.13

622

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 20.6万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.7万人学习