所以我有一个格式的JSON文件...
[
{
"Key":"Value",
"Key2":"Value2",
"Key3":"Value3"
},
{
"Foo":"Bar",
"Blah":2
}
]
我只想读入其中的哈希部分,然后将它们传递给goRequest之类的HTTP请求,因为goRequest很好,只需要将JSON放在字符串中即可。
package main
request := gorequest.New()
resp, body, errs := request.Post("http://example.com").
Set("Notes","gorequst is coming!").
Send(`{"Foo":"Bar","Blah":2}`).
End()
我不在乎JSON是什么,也不需要解组Structs或任何形式的东西,只需要保留为字符串并完全不受影响,然后传递给请求就可以了。
我在网上看到了很多东西,但是它似乎总是想解组JSON到Go Structs和排序,如果您想关心JSON中的实际内容,这很好,但是就我而言,这似乎像不必要的开销。
我将如何完成这样的事情?看起来很简单,但是Go的现有JSON库似乎都无法完成此任务。
谢谢。
您可能正在寻找json.RawMessage。
对于例如:
package main
import (
"encoding/json"
"fmt"
"log"
)
func main() {
txt := []byte(`
[
{"key1" : "value1" },
{"key2" : "value2" }
]`)
msg := []json.RawMessage{}
err := json.Unmarshal(txt, &msg)
if err != nil {
log.Fatal(err)
}
for _, c := range msg {
fmt.Printf("%s\n", string(c))
}
}
请注意,在示例中,键/值对之间的多余空格是有意的:您将看到这些保留在输出中。
另外,即使您不关心确切的结构,也可以使用interface{}
变量来动态地戳它。有关此示例的运行示例,请参见JSON and Go文档,该示例位于带有接口{}的通用JSON部分。
如果我们尝试执行类似流方法的操作,则可以尝试使用进行自定义操作io.Reader
。该JSON
分析器假定您可以一次代表内存中的所有。该假设可能不适用于您的情况,因此我们必须打破一些限制。
也许我们可能会手动消耗前面的字节,io.Reader
直到我们吃掉前导[
字符,然后重复调用json.Decode
其余的io.Reader
。像这样的东西:
package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"log"
)
func main() {
var txt io.Reader = bytes.NewBufferString(`
[
{"key1" : "value1" },
{"key2" : "value2" }
]`)
buf := make([]byte, 1)
for {
_, err := txt.Read(buf)
if err != nil {
log.Fatal(err)
}
if buf[0] == '[' {
break
}
}
for {
decoder := json.NewDecoder(txt)
msg := json.RawMessage{}
err := decoder.Decode(&msg)
if err != nil {
break
}
fmt.Printf("I see: %s\n", string(msg))
txt = decoder.Buffered()
for {
_, err := txt.Read(buf)
if err != nil {
log.Fatal(err)
}
if buf[0] == ',' || buf[0] == ']' {
break
}
}
}
}
这段代码非常混乱且不明显。我也不认为这是个好主意。如果必须以流方式处理此问题,那么对于这种情况,JSON可能不是一种很好的序列化格式。如果您可以控制输入,则应考虑对其进行更改,以使其更适合流式处理方法:像我们在此处所做的那样的黑臭味很糟糕,表明输入的形状不正确。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句