我有一个{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文档,发现没有结构的字符串解析没有解决方案
答案 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)
}
小基准图像显示正则表达式比其他解决方案要慢多少。当其他选项可用或性能不成问题时,应使用它们。
甚至像这样的东西都会执行正则表达式
var n string
for _, r := range str {
if unicode.IsDigit(r) {
n += string(r)
}
}
答案 2 :(得分:0)
正如评论者所指出的,您的示例字符串are not valid JSON因为用大括号分隔的JSON文档必须是带有键/值对列表(例如{"x":1}
,并且数字是普通字符(例如{{1 }})。
但是,“括号括起来的整数”的这种简单表示法可以很容易地通过多种方法来解析,最终可以通过检查2
的语法来实现。
下面的示例代码检查给定字符串的第一个符文是大括号OPEN_BRACE, DIGIT+, CLOSE_BRACE
,最后一个符是大括号{
,并且可以使用{将其之间的所有内容解析为整数{3}}:
}
当然,其他策略也是可行的(例如使用正则表达式),最终由您决定哪种实现最适合您的用例。