拆分http数据json

时间:2016-09-26 04:50:31

标签: json tcl eggdrop

我在这里有一个http查询:http://www.omdbapi.com/?i=tt0084787&plot=full&language=1&r=json

我怎么能分开这个?

我可以为所有的vairbles,Title,Year,Rated,Gen​​re,...语言,imdbRating,imdbVotes等。

bind pub - !imdb imdb

proc imdb { nick uhost hand chan text} {
    package require http 
    set id [lindex [split $text] 0];
    set url "http://www.omdbapi.com/?i=$id&plot=short&r=json"
    set data [::http::data [::http::geturl $url]]
}

1 个答案:

答案 0 :(得分:3)

首先,不要将package require放入程序中。这不够优雅。其次,不要忘记http::cleanup令牌,否则你会得到一些泄露的资源(只是内存,但随着时间的推移可能会累积起来)。

可以使用json包的json2dict命令将JSON响应转换为Tcl字典。 (该软件包是tcllib的一部分,如果你没有安装它。)一旦你有了字典,使用dict with将其打开为单独的变量;这是你案件的最简单方法。

这是结果,也有不少评论。

# package requires go at the top *BY CONVENTION* so they're easy to see
package require http
package require json

bind pub - !imdb imdb

proc imdb { nick uhost hand chan text} {
    # Parse what the user said; this is shorter, especially when working with more variables

    lassign [split $text] id

    # Talk to the web service and parse the result
    # NOTE that this doesn't handle errors such as a non-existent ID...

    set tok [http::geturl "http://www.omdbapi.com/?i=$id&plot=short&r=json"]
    set data [json::json2dict [http::data $tok]]
    http::cleanup $tok

    # Work with the results

    dict with data { # <<<< Magical!
        puthelp "Movie: $Title ($Year)"
    }
}