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

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

go - 如何從標準輸入解析無限的json數組?

go - 如何從標準輸入解析無限的json數組?

Go
慕尼黑5688855 2021-09-27 16:41:23
我正在嘗試為 i3status 編寫一個小的替代品,這是一個與符合此協議的i3bar 通信的小程序。他們通過標準輸入和標準輸出交換消息。兩個方向的流都是一個無限的 json 對象數組。從 i3bar 到 i3status(我想替換它)的流的開始看起來像這樣:[{"name": "some_name_1","instance": "some_inst_1","button": 1,"x": 213,"y": 35},{"name": "some_name_1","instance": "some_inst_2","button": 2,"x": 687,"y": 354},{"name": "some_name_2","instance": "some_inst","button": 1,"x": 786,"y": 637},{"name": "some_name_3","instance": "some_inst","button": 3,"x": 768,"y": 67}...這是代表點擊的對象的“數組”。該陣列永遠不會關閉。我現在的問題是:解析這個的正確方法是什么?顯然我不能使用這個json庫,因為這不是一個有效的 json 對象。
查看完整描述

4 回答

?
汪汪一只貓

TA貢獻1898條經驗 獲得超8個贊

我也在為 i3 中的點擊事件編寫自己的處理程序。這就是我偶然發現這個線程的方式。


Golang 標準庫實際上確實完成了所需的工作(Golang 1.12)。不確定當你問這個問題的時候有沒有?


// json parser read from stdin

decoder := json.NewDecoder(os.Stdin)


// Get he first token - it should be a '['

tk, err := decoder.Token()

if err != nil {

    fmt.Fprintln(os.Stderr, "couldn't read from stdin")

    return

}

// according to the docs a json.Delim is one [, ], { or }

// Make sure the token is a delim

delim, ok := tk.(json.Delim)

if !ok {

    fmt.Fprintln(os.Stderr, "first token not a delim")

    return

}

// Make sure the value of the delim is '['

if delim != json.Delim('[') {

    fmt.Fprintln(os.Stderr, "first token not a [")

    return

}


// The parser took the [ above

// therefore decoder.More() will return

// true until a closing ] is seen - i.e never 

for decoder.More() {

    // make a Click struct with the relevant json structure tags

    click := &Click{}


    // This will block until we have a complete JSON object

    // on stdin

    err = decoder.Decode(click)

    if err != nil {

            fmt.Fprintln(os.Stderr, "couldn't decode click")

            return

    }

    // Do something with click event

}


查看完整回答
反對 回復 2021-09-27
?
萬千封印

TA貢獻1891條經驗 獲得超3個贊

您正在尋找的是 JSON 的 Streaming API。有很多可用的快速谷歌搜索顯示項目確實將流媒體列為其高級功能之一。


查看完整回答
反對 回復 2021-09-27
  • 4 回答
  • 0 關注
  • 231 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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