猿问

将复杂的 JSON 解析为 goweb REST Create() 函数

对于一个长的问题,我提前道歉。希望你能忍受我。

我正在使用goweb库,并尝试使用示例 Web 应用程序

我一直在尝试修改RESTful 示例代码,它将 a 定义Thing为:

type Thing struct {

    Id   string

    Text string

}

AThing是通过向 发送HTTP Post带有适当JSON正文的请求来创建的http://localhost:9090/things。这是在Create函数的示例代码中处理的,特别是以下几行:


dataMap := data.(map[string]interface{})


thing := new(Thing)

thing.Id = dataMap["Id"].(string)

thing.Text = dataMap["Text"].(string)

这一切都很好,我可以运行示例服务器(侦听http://localhost:9090/)并且服务器按预期运行。


例如:


curl -X POST -H "Content-Type: application/json" -d '{"Id":"TestId","Text":"TestText"}' http://localhost:9090/things

没有错误返回,然后我GET是Thing用


curl http://localhost:9090/things/TestId

它返回


{"d":{"Id":"TestId","Text":"TestText"},"s":200}

到现在为止还挺好。


现在,我想修改Thing类型,并添加自定义ThingText类型,如下所示:


type ThingText struct {

    Title   string

    Body    string

}


type Thing struct {

    Id   string

    Text ThingText

}

这本身不是问题,我可以Create像这样修改函数:


thing := new(Thing)

thing.Id = dataMap["Id"].(string)

thing.Text.Title = dataMap["Title"].(string)

thing.Text.Body = dataMap["Body"].(string)

并运行前一个curl POST请求,JSON设置为:


{"Id":"TestId","Title":"TestTitle","Title":"TestBody"}

它返回没有错误。


我再次可以GET访问ThingURL,它返回:


{"d":{"Id":"TestId","Text":{"Title":"TestTitle","Body":"TestBody"}},"s":200}

再一次,到目前为止,很好。


现在,我的问题:


如何修改Create函数以允许我对其进行POST复杂JSON处理?


例如,JSON上面最后返回的字符串包括{"Id":"TestId","Text":{"Title":"TestTitle","Body":"TestBody"}}. 我希望能够POST 精确JSON到端点并Thing创建。


我已经按照代码回来了,似乎该data变量的类型Context.RequestData()来自https://github.com/stretchr/goweb/context,而内部Map似乎是Object.Map来自https://github.com/stretchr的类型/stew/,描述为“具有附加有用功能的地图[字符串]接口{}。” 特别是,我注意到“支持点语法来设置深度值”。


我不知道如何设置thing.Text.Title = dataMap...语句以便将正确的JSON字段解析为它。除了 中的string类型之外,我似乎无法使用任何其他内容dataMap,如果我尝试这样JSON做,则会出现类似于以下内容的错误:


 http: panic serving 127.0.0.1:59113: interface conversion: interface is nil, not string

再次对这个可笑的长问题表示抱歉。我非常感谢您的阅读,以及您可能需要提供的任何帮助。谢谢!


墨色风雨
浏览 175回答 1
1回答
随时随地看视频慕课网APP

相关分类

Go
我要回答