为了账号安全,请及时绑定邮箱和手机立即绑定

JSON解析异常

JSON解析异常

Go
守候你守候我 2023-03-21 15:33:37
{1}我有一个或可能有一个 JSON 字符串{2},我需要解析它并获得解析的整数。我知道我做错了,但这是我到目前为止所拥有的:package mainimport (    "fmt"    "encoding/json")func main(){  jsonStr:="{1}"  jsonData:=[]byte(jsonStr)  var v uint  json.Unmarshal(jsonData, &v)  data:=v  fmt.Println(data)}在此示例中,data变量应包含整数值 1 或 2(如果jsonStr值为{2}根据我使用 JSON 和 Go 的经验,我通常使用一个结构并将其传递到 Unmarshalling 函数中,但我无法从该数据响应中创建一个结构。我查看了 API 文档,没有找到没有结构的字符串解析的解决方案
查看完整描述

3 回答

?
30秒到达战场

TA贡献1828条经验 获得超6个赞

这似乎对我有用:


import "regexp"


re:=regexp.MustCompile("[0-9A-Za-z]+")

val:=re.FindAllString(jsonStr,-1)[0]


查看完整回答
反对 回复 2023-03-21
?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

正如评论者所指出的,您的示例字符串不是有效的 JSON,因为用大括号分隔的 JSON 文档必须是具有键值对列表的对象(例如{"x":1},数字是普通的(例如2))。但是,这个简单的“大括号括起”符号integer” 可以通过多种方式轻松解析,最终通过检查OPEN_BRACE, DIGIT+, CLOSE_BRACE.

下面的示例代码检查给定字符串的第一个符文是左大括号{,最后一个是右大括号},中间的所有内容都可以使用以下方法解析为整数strconv.ParseInt(...)

func main() {

  ss := []string{"{1}", "{2}", "{-123}", "{foo}", "{10", "20}", "30"}

  for _, s := range ss {

    x, err := parseBraceNumber(s)

    fmt.Printf("s=%-10qx=%-10derr=%v\n", s, x, err)

  }

  // s="{1}"     x=1         err=<nil>

  // s="{2}"     x=2         err=<nil>

  // s="{-123}"  x=-123      err=<nil>

  // s="{foo}"   x=0         err=invalid brace number "{foo}"

  // s="{10"     x=0         err=invalid brace number "{10"

  // s="20}"     x=0         err=invalid brace number "20}"

  // s="30"      x=0         err=invalid brace number "30"

}


func parseBraceNumber(s string) (int64, error) {

  if len(s) < 3 || s[0] != '{' || s[len(s)-1] != '}' {

    return 0, fmt.Errorf("invalid brace number %q", s)

  }

  x, err := strconv.ParseInt(s[1:len(s)-1], 10, 64)

  if err != nil {

    return 0, fmt.Errorf("invalid brace number %q", s)

  }

  return x, nil

}

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


查看完整回答
反对 回复 2023-03-21
?
德玛西亚99

TA贡献1770条经验 获得超3个赞

正则表达式的一些替代方案因为它们占用大量资源并且往往比其他解决方案慢,为简洁起见忽略错误。实际上他们不会。


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)

}

显示正则表达式比其他解决方案慢多少的小型基准图像。当其他选项可用或性能不是问题/关注时,应使用它们。 

//img1.sycdn.imooc.com//64195e23000191c604960082.jpg

即使是这样的东西也会执行正则表达式


var n string

for _, r := range str {

    if unicode.IsDigit(r) {

        n += string(r)

    }

}

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


查看完整回答
反对 回复 2023-03-21
  • 3 回答
  • 0 关注
  • 95 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信