草庐IT

json - 将 json 解码为反射结构(续)

coder 2024-07-05 原文

我想编写一个 gin 中间件处理程序,它从 c.Request.FormValue("data") 获取数据,将其解码为一个结构(结构相当不同)并在上下文中设置一个变量(c.Set("Data",newP))。所以我搜索并写下了这个:

package middleware

import (
    "reflect"
    "fmt"
    "github.com/gin-gonic/gin"
    "encoding/json"
)

//https://semaphoreci.com/community/tutorials/test-driven-development-of-go-web-applications-with-gin
//https://github.com/gin-gonic/gin/issues/420
func Data(t reflect.Type) gin.HandlerFunc {
    return func(c *gin.Context) {
        //https://stackoverflow.com/a/7855298/5257901
        //https://stackoverflow.com/a/45680060/5257901
        //t := reflect.TypeOf(orig)
        v := reflect.New(t.Elem())
        // reflected pointer
        newP := v.Interface()

        data:=c.Request.FormValue("data")
        fmt.Printf("%s data:%s\n",c.Request.URL.Path,data)
        if err:=json.Unmarshal([]byte(data),newP); err!=nil{
            fmt.Printf("%s data unmarshall %s, data(in quotes):\"%s\"",c.Request.URL.Path,err,data)
            c.Abort()
            return
        }
        ustr, _:=json.Marshal(newP)
        fmt.Printf("%s unmarshalled:%s\n",c.Request.URL.Path,ustr)
        c.Set("Data",newP)
        c.Next()
    }
}

我这样使用它:

func InitHandle(R *gin.Engine) {
    Plan := R.Group("/Plan")
    Plan.POST("/clickCreate",middleware.Data(reflect.TypeOf(new(tls.PlanTabel))), clickCreatePlanHandle)
}

var data = *(c.MustGet("Data").(*tls.PlanTabel))

又重又丑。我要

middleware.Data(tls.PlanTabel{})

var data = c.MustGet("Data").(tls.PlanTabel)

换句话说,省略 gin,我想要一个吃掉 i interface{} 并返回函数 (data string) (o interface{} )

func Data(i interface{}) (func (string) (interface{})) {
    //some reflect magic goes here
    //extract the structure type from interface{} :

    //gets a reflect type pointer to it, like
    //t := reflect.TypeOf(orig)
    return func(data string) (o interface{}) {
        //new reflected structure (pointer?)
        v := reflect.New(t.Elem())
        //interface to it
        newP := v.Interface()
        //unmarshal
        json.Unmarshal([]byte(data),newP);
        //get the structure from the pointer back

        //returns interface to the structure

        //reflect magic ends
    }
}

最佳答案

问题中的代码很接近。

尝试以下功能。结果函数返回与 i 类型相同的类型:

func Data(i interface{}) func(string) (interface{}, error) {
    return func(data string) (interface{}, error) {
        v := reflect.New(reflect.TypeOf(i))
        err := json.Unmarshal([]byte(data), v.Interface())
        return v.Elem().Interface(), err
    }
}

使用示例:

type Test struct {
    A string
    B string
}

f := Data((*Test)(nil))
v, err := f(`{"A": "hello", "B": "world"}`)
if err != nil {
    log.Fatal(err)
}
fmt.Printf("%#v\n", v) // v is a *Test

f = Data("")
v, err = f(`"Hello"`)
if err != nil {
    log.Fatal(err)
}
fmt.Printf("%#v\n", v)  // v is a string

如果要返回结构值,则将结构值作为参数传递给 Data:

f = Data(Test{})
v, err = f(`{"A": "hello", "B": "world"}`)
if err != nil {
    log.Fatal(err)
}
fmt.Printf("%#v\n", v) // v is a Test

Playground example

关于json - 将 json 解码为反射结构(续),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48636077/

有关json - 将 json 解码为反射结构(续)的更多相关文章

  1. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  2. 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的路径中定义。这

  3. ruby - 是否有用于序列化和反序列化各种格式的对象层次结构的模式? - 2

    给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最

  4. 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":

  5. ruby-on-rails - 一般建议和推荐的文件夹结构 - Sinatra - 2

    您将如何构建一个简单的Sinatra应用程序?我正在制作,我希望该应用具有以下功能:“应用程序”更像是一个包含所有信息的管理仪表板。然后另一个应用程序将通过REST访问信息。我还没有创建仪表板,只是从数据库中获取东西session和身份验证(尚未实现)您可以上传图片,其他应用可以显示这些图片我已经使用RSpec创建了一个测试文件通过Prawn生成报告目前的设置是这样的:app.rbtest_app.rb因为我实际上只有应用程序和测试文件。到目前为止,我已经将Datamapper用于ORM,将SQLite用于数据库。这是我的第一个Ruby/Sinatra项目,所以欢迎任何和所有建议-我应

  6. 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("

  7. ruby - 如何在 ruby​​ 中复制目录结构,不包括某些文件扩展名 - 2

    我想编写一个ruby​​脚本来递归复制目录结构,但排除某些文件类型。因此,给定以下目录结构:folder1folder2file1.txtfile2.txtfile3.csfile4.htmlfolder2folder3file4.dll我想复制这个结构,但不包含.txt和.cs文件。因此,生成的目录结构应如下所示:folder1folder2file4.htmlfolder2folder3file4.dll 最佳答案 您可以使用查找模块。这是一个代码片段:require"find"ignored_extensions=[".cs"

  8. ruby-on-rails - Rails 渲染带有驼峰命名法的 json 对象 - 2

    我在一个简单的RailsAPI中有以下Controller代码:classApi::V1::AccountsControllerehead:not_foundendendend问题在于,生成的json具有以下格式:{id:2,name:'Simpleaccount',cash_flows:[{id:1,amount:34.3,description:'simpledescription'},{id:2,amount:1.12,description:'otherdescription'}]}我需要我生成的json是camelCase('cashFlows'而不是'cash_flows'

  9. ruby - 使用 JSON gem 将自定义对象转换为 JSON - 2

    我正在学习如何使用JSONgem解析和生成JSON。我可以轻松地创建数据哈希并将其生成为JSON;但是,在获取一个类的实例(例如Person实例)并将其所有实例变量放入哈希中以转换为JSON时,我脑袋放屁。这是我遇到问题的例子:require"json"classPersondefinitialize(name,age,address)@name=name@age=age@address=addressenddefto_jsonendendp=Person.new('JohnDoe',46,"123ElmStreet")p.to_json我想创建一个.to_json方法,这样我就可以获

  10. ruby-on-rails - 如何使用驼峰键名称从 Rails 返回 JSON - 2

    我正在构建一个带有Rails后端的JS应用程序,为了不混淆snake和camelcases,我想通过从服务器返回camelcase键名来规范化这一切。因此,当从API返回时,user.last_name将返回user.lastName。我如何实现这一点?谢谢!编辑:添加Controller代码classApi::V1::UsersController 最佳答案 我的方法是使用ActiveModelSerializer和json_api适配器:在你的Gemfile中,添加:gem'active_model_serializers'创建

随机推荐