亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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)

}

顯示正則表達式比其他解決方案慢多少的小型基準圖像。當其他選項可用或性能不是問題/關注時,應使用它們。 

http://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 關注
  • 126 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號