将JSON读入GO字符串

斯蒂芬·卡曼(Stephen Carman):

所以我有一个格式的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库似乎都无法完成此任务。

谢谢。

dyoo:

您可能正在寻找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.ReaderJSON分析器假定您可以一次代表内存中的所有。该假设可能不适用于您的情况,因此我们必须打破一些限制。

也许我们可能会手动消耗前面的字节,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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章