gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 02:00:18 25 4
gpt4 key购买 nike

我提前为一个非常的长问题道歉。希望您能多多包涵。

我正在使用 goweb库,并尝试使用 example web app .

我一直在尝试修改 RESTful example code ,它定义了一个 Thing作为:

type Thing struct {
Id string
Text string
}

一个 Thing 是通过发送一个 HTTP Post 请求和一个适当的 JSON 主体到 http://localhost 创建的:9090/事物。这在 Create function 中的示例代码中处理。 ,特别是行:

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 Thing URL 并返回:

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

同样,到目前为止,一切都很好。

现在,我的问题:

我如何修改 Create 函数以允许我向它POST 复杂的 JSON

例如,上面最后返回的 JSON 字符串包括 {"Id":"TestId","Text":{"Title":"TestTitle","Body":"测试体"}}我希望能够POST 那个确切的 JSON 到端点并拥有 Thing已创建。

我已经按照代码返回,data 变量似乎是来自 https://github.com/stretchr/goweb/contextContext.RequestData() 类型,并且内部 Map 似乎是 Object.Map 类型来自 https://github.com/stretchr/stew/ , 描述为 "a map[string]interface{} with additional helpful functionality."特别是,我注意到 "Supports dot syntax to set deep values."

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

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

再次抱歉,这个问题太长了。非常感谢您的阅读,以及您可能提供的任何帮助。谢谢!

最佳答案

作为JSON package documentationJSON and Go introduction描述,JSON 数据可以通过接口(interface){}/字符串映射进行一般解析,也可以直接解码为结构类型。

您链接到的示例代码以及您基于您的更改似乎使用了通用的字符串映射方法,dataMap := data.(map[string]interface{})

由于您所需的 JSON 数据是对象中的对象,因此它只是 map 中的 map 。

所以你应该能够

dataMap := data.(map[string]interface{})
subthingMap := dataMap["Text"].(map[string]interface{})
thing.Text.Title = subthingMap["Title"].(string)
thing.Text.Body = subthingMap["Body"].(string)

我不确定为什么该代码使用强制转换和泛型类型,而不是直接从 JSON 到结构类型(我猜是抽象)的类型安全解码。使用 json 包解码来构造类型会是这样的

type ThingText struct {
Title string
Body string
}

type Thing struct {
Id string
Text ThingText
}


decoder := json.NewDecoder(body)
var thingobj Thing
for {
if err := decoder.Decode(&thingobj); err == io.EOF {
break
} else if err != nil {
log.Fatal(err)
}
fmt.Println(thingobj)
}

其中 body 是一个 io.Reader - 在简单/大多数情况下来自 http.Response.Body

关于json - 将复杂的 JSON 解析为 goweb REST Create() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17252915/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com