返回顶部
首页 > 资讯 > 后端开发 > GO >如何用 Golang 解码这个嵌套的 json?
  • 771
分享到

如何用 Golang 解码这个嵌套的 json?

2024-02-10 19:02:11 771人浏览 八月长安
摘要

如何用golang解码嵌套的JSON,是许多开发者在处理复杂数据结构时面临的挑战。在这篇文章中,PHP小编香蕉将为您详细介绍如何使用Golang中的jsON包来解析和处理嵌套的JSON

如何用golang解码嵌套的JSON,是许多开发者在处理复杂数据结构时面临的挑战。在这篇文章中,PHP小编香蕉将为您详细介绍如何使用Golang中的jsON包来解析和处理嵌套的JSON数据。通过学习本文的内容,您将能够轻松地处理各种复杂的JSON结构,实现更高效的数据解析和处理。无论您是初学者还是有一定经验的开发者,本文都将为您提供有用的技巧和示例代码,帮助您解决JSON解码的难题。让我们一起来探索Golang中解码嵌套JSON的方法吧!

问题内容

我正在尝试将嵌套 json 解码为包含文件和数据的请求的一部分。

数据看起来像这样

{data: {"date_required":null}}

我最初没有包含完整的错误,因为我忘记记录它。

2023/11/17 23:40:35 error in decoding request body data
2023/11/17 23:40:35 invalid character '.' looking for beginning of value

我认为此错误可能是由于表单数据不是 JSON 造成的,但不知道如何修复它。我的 Flutter 代码看起来就像发送了有效的 JSON。内容类型是 multipart/fORM-data 这可能是导致错误的原因。我相信我的代码的文件上传部分需要此内容类型。

请求来自我的 Flutter 客户端,代码如下:

final multipartFile =
    Http.MultipartFile.fromBytes('file', bytes, filename: file?.name);

final request = http.MultipartRequest('POST', Uri.parse(user.fileUrl));

request.files.add(multipartFile);

request.headers.addAll(headers);

String dateRequiredStr = dateRequired != null
    ? jsonEncode({'date_required': dateRequired})
    : jsonEncode({'date_required': null});

request.fields['data'] = dateRequiredStr;

在我的 go api 中我正在这样做。

模型(根据下面的答案进行编辑):

type FileRequiredDate struct {
    DateRequired pgtype.Date `json:"date_required"`
}

type FileRequiredDateData struct {
    Data FileRequiredDate `json:"data"`
}

代码:

func (rs *appResource) uploadTranscriptAudioFile(w http.ResponseWriter, r *http.Request) {

start := time.Now()

const maxUploadSize = 500 * 1024 * 1024 // 500 Mb

var requiredByDate FileRequiredDateData

decoder := json.NewDecoder(r.Body)

err := decoder.Decode(&requiredByDate)

if err != nil {
    log.Println("error in decoding request body data")
    log.Println(err.Error())
    http.Error(w, err.Error(), http.StatusBadRequest)
    return
}

file, handler, err := r.FormFile("file")

if err != nil {
    log.Println(err)
    http.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest)
    return
}

defer file.Close()

fileSize := handler.Size

if fileSize > maxUploadSize {
    http.Error(w, "FILE_TOO_BIG", http.StatusBadRequest)
    return
}

fileName := handler.Filename

httputil.DumpRequest -> 内容类型:multipart/form-data

编辑:根据这个问题的答案,我编辑了如下代码:

mr, err := r.MultipartReader()

if err != nil {
    log.Println(err)
    http.Error(w, err.Error(), http.StatusInternalServerError)
    return
}

for {
    part, err := mr.NextPart()

    // This is OK, no more parts
    if err == io.EOF {
        break
    }

    // Some error
    if err != nil {
        log.Println("multipart reader other error")
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    log.Println(part.FormName())

    if part.FormName() == "data" {

        log.Println("multipart reader found multipart form name data")

        decoder := json.NewDecoder(r.Body)

        err = decoder.Decode(&requiredByDate)

        if err != nil {
            log.Println("error in decoding request body data")
            log.Println(err.Error())
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }
    }
}

    if part.FormName() == "file" {

        file, handler, err := r.FormFile("file")  <-- error here

        if err != nil {
            log.Println("error getting form file")
            log.Println(err.Error())
            http.Error(w, http.StatusText(http.StatusBadRequest), http.StatusInternalServerError)
            return
        }

        defer file.Close()

        guid := xid.New()

        userId := getUserFromJwt(r)

        user, err := getUser(rs, int64(userId))

        if err != nil {
            log.Println("user not found")
            log.Println(err.Error())
            http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
            return
        }

        err = uploadToMiNIO(rs, file, fileSize, fileName, guid.String(), userId)


----

这给了我这个输出:

2023/11/17 23:23:30 data
2023/11/17 23:23:30 file

编辑:

我通过使用 decoder := json.NewDecoder(part) 而不是 decoder := json.NewDecoder(r.Body) 解决了当前问题

现在我在获取表单文件时遇到错误。看来我应该以某种方式使用零件,但零件没有文件属性。自从我将表单数据添加到多部分请求后,r.Body 不再可用。这看起来像是一个不同的问题。

解决方法

虽然这不能解决 404 问题(请使用请求处理程序代码更新您的问题),但您的结构似乎与您发送的内容不匹配。您可以执行以下操作来解决此问题:

type FileRequiredDate struct {
    DateRequired pgtype.Date `json:"date_required"`
}

type FileRequiredDateData struct {
    Data FileRequiredDate `json:"data"`
}

这应该按预期解码请求正文。

对于 404,您应该仔细检查客户端代码发送的请求路径和方法是否与服务器请求处理程序路径和方法相匹配。

以上就是如何用 Golang 解码这个嵌套的 json?的详细内容,更多请关注编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: 如何用 Golang 解码这个嵌套的 json?

本文链接: https://lsjlt.com/news/563204.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何用 Golang 解码这个嵌套的 json?
    如何用Golang解码嵌套的JSON,是许多开发者在处理复杂数据结构时面临的挑战。在这篇文章中,php小编香蕉将为您详细介绍如何使用Golang中的JSON包来解析和处理嵌套的JSON...
    99+
    2024-02-10
  • 使用Jackson-json解析一个嵌套的json字符串
    目录Jackson-json解析一个嵌套的json字符串关于这个jar包然后读入我的json字符串(str)把节点展开取到shops时就简单了,贴上代码java解析多层嵌套json字...
    99+
    2024-04-02
  • json中有复杂的嵌套如何解析
    要解析复杂嵌套的JSON,可以使用递归的方式来处理。以下是一个简单的Python示例,演示如何解析具有复杂嵌套的JSON数据:```...
    99+
    2023-08-25
    json
  • 解码/解组复杂的嵌套 JSON 数据结构
    php小编草莓向大家介绍一种强大的技巧,即解码/解组复杂的嵌套 JSON 数据结构。在现代的网络应用中,JSON 数据结构被广泛使用,但是当数据结构变得复杂时,解析和提取所需信息会变得...
    99+
    2024-02-10
  • Python如何取json中的嵌套数据
    在Python中,您可以使用`json`模块来处理JSON数据。如果您要获取嵌套在JSON中的数据,可以使用点(.)或方括号([])...
    99+
    2023-09-25
    Python json
  • PHP无法解析嵌套的JSON数据如何解决
    本篇内容主要讲解“PHP无法解析嵌套的JSON数据如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP无法解析嵌套的JSON数据如何解决”吧!JSON是一种轻量级的数据交换格式,通常用于...
    99+
    2023-07-05
  • go语言中使用struct解析嵌套的json
    问题内容 无法使用 go lang 将嵌套 json 解析为结构对象 我有一个嵌套的 json 字符串,我想使用 go 语言中的结构体来解析它。 json 看起来像这样 {"actio...
    99+
    2024-02-06
    go语言
  • 如何在解组时将整个 json 字符串传递到嵌套结构的字段?
    在PHP中,当我们需要将整个JSON字符串传递给嵌套结构的字段时,有一种简单的方法可以实现。首先,我们需要确保我们已经将JSON字符串解码为PHP数组或对象。然后,我们可以使用json...
    99+
    2024-02-13
  • python嵌套try...except如何使用详解
    目录引言前提抛出异常自定义异常异常对象多重try补充:捕获异常的小方法方法一:捕获所有异常方法二:采用traceback模块查看异常方法三:采用sys模块回溯最后的异常总结引言 众所...
    99+
    2024-04-02
  • Android利用Gson解析嵌套多层的Json的简单方法
    首先先讲一个比较简单点的例子(最简单的我就不讲啦,网上很多),帮助新手理解Gson的使用方法: 比如我们要解析一个下面这种的Json: String json = {"a"...
    99+
    2022-06-06
    方法 JSON gson 嵌套 Android
  • 如何使用Promise解决多个异步Ajax请求导致的代码嵌套问题
    这篇文章将为大家详细讲解有关如何使用Promise解决多个异步Ajax请求导致的代码嵌套问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。问题前端小同学在做页面的时候,犯...
    99+
    2024-04-02
  • jQuery如何创建一个嵌套的过滤器
    这篇文章给大家分享的是有关jQuery如何创建一个嵌套的过滤器的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。创建一个嵌套的过滤器.filter(":not(:has(.selected))")...
    99+
    2023-06-27
  • PropertyGrid 控件如何显示两层嵌套的动态 JSON 对象
    要在 PropertyGrid 控件中显示两层嵌套的动态 JSON 对象,您需要创建一个类来表示 JSON 对象的结构,并将其绑定到...
    99+
    2023-09-26
    PropertyGrid
  • mybatis中的嵌套查询如何使用
    今天小编给大家分享一下mybatis中的嵌套查询如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。mybatis嵌套查询...
    99+
    2023-07-05
  • 如何使用Python中的内嵌函数和嵌套作用域
    如何使用Python中的内嵌函数和嵌套作用域Python是一种功能强大的编程语言,它为开发者提供了许多有用的功能和工具。其中,内嵌函数和嵌套作用域是Python中的两个重要概念。本文将介绍如何使用这些概念,并提供具体的代码示例。在Pytho...
    99+
    2023-10-28
    作用域链 Python内嵌函数 嵌套作用域
  • Spring的嵌套事务(Propagation.NESTED)到底是个啥案例代码讲解
    目录什么是嵌套事务案例什么是嵌套事务 嵌套事务其实是对数据库SavePoint概念的Java操作版封装,什么是SavePoint参考我另一篇文章:https://www.jb51.n...
    99+
    2023-01-07
    Spring嵌套事务 Spring Propagation.NESTED
  • Go语言接口的嵌套如何使用
    这篇文章主要讲解了“Go语言接口的嵌套如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言接口的嵌套如何使用”吧!在Go语言中,不仅结构体与结构体之间可以嵌套,接口与接口间也可以通...
    99+
    2023-07-06
  • iframe嵌套的页面无法显示如何解决
    如果iframe嵌套的页面无法显示,可能是由于以下几个原因导致的:1. 目标页面服务器设置了X-Frame-Options头。X-F...
    99+
    2023-09-21
    iframe
  • Android如何解决ScrollView嵌套CridView的显示问题
    这篇文章将为大家详细讲解有关Android如何解决ScrollView嵌套CridView的显示问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Android 解决ScrollView嵌套CridVie...
    99+
    2023-05-30
    android scrollview
  • Golang语言JSON解码函数Unmarshal的使用
    目录前言func Unmarshal普通JSONJSON内嵌普通JSONJSON内嵌数组JSONJSON内嵌具有动态Key的JSON总结前言 工作中我们经常会遇到解码JSON格式的数...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作