异常JSON解析

时间:2018-08-17 01:46:46

标签: json go

我有一个{1}或可能为{2}的JSON字符串,我需要对其进行解析并获取已解析的整数。

我知道我做错了,但是到目前为止,这是我所要做的:

package main

import (
    "fmt"
    "encoding/json"
)

func main(){
  jsonStr:="{1}"
  jsonData:=[]byte(jsonStr)
  var v uint
  json.Unmarshal(jsonData, &v)
  data:=v
  fmt.Println(data)
}

在此示例中,如果data的值为jsonStr,则{2}变量应包含1或2的整数值

根据我使用JSON和Go的经验,我通常使用一个结构并将其传递给Unmarshalling函数,但是我无法根据此数据响应来构造一个结构。

我查看了API文档,发现没有结构的字符串解析没有解决方案

3 个答案:

答案 0 :(得分:1)

这似乎对我有用:

import "regexp"

re:=regexp.MustCompile("[0-9A-Za-z]+")
val:=re.FindAllString(jsonStr,-1)[0]

答案 1 :(得分:0)

一些正则表达式的替代方法,因为它们占用大量资源,并且比其他解决方案要慢,因此为简洁起见,会忽略错误。在生产中他们不会。

package main

import (
    "fmt"
    "strconv"
)

func main() {
    str := "{1}"
    num, _ := strconv.ParseInt(string(str[1]), 10, 64)
    fmt.Println(num)
}

或更健壮的东西,它并不关心{}字段中的位数。

package main

import (
    "fmt"
    "strconv"
)

func main() {
    str := "{341}"
    num, _ := strconv.ParseInt(string(str[1:len(str)-1]), 10, 64)
    fmt.Println(num)
}

小基准图像显示正则表达式比其他解决方案要慢多少。当其他选项可用或性能不成问题时,应使用它们。 enter image description here

甚至像这样的东西都会执行正则表达式

var n string
for _, r := range str {
    if unicode.IsDigit(r) {
        n += string(r)
    }
}

基准代码 https://goplay.space/#PLMtSrMTN9k

答案 2 :(得分:0)

正如评论者所指出的,您的示例字符串are not valid JSON因为用大括号分隔的JSON文档必须是带有键/值对列表(例如{"x":1},并且数字是普通字符(例如{{1 }})。  但是,“括号括起来的整数”的这种简单表示法可以很容易地通过多种方法来解析,最终可以通过检查2的语法来实现。

下面的示例代码检查给定字符串的第一个符文是大括号OPEN_BRACE, DIGIT+, CLOSE_BRACE,最后一个符是大括号{,并且可以使用{将其之间的所有内容解析为整数{3}}:

}

当然,其他策略也是可行的(例如使用正则表达式),最终由您决定哪种实现最适合您的用例。