【问题标题】:Sending json file in curl and receiving it in R using plumber在 curl 中发送 json 文件并使用管道工在 R 中接收它
【发布时间】:2023-03-10 16:47:01
【问题描述】:

我需要发送一个包含多个值的 json 文件并使用管道工在 R 中接收它,我试过了,但它似乎不起作用,

library("rjson")
#install.packages("rjson")
#* @get /predict
#* @post /predict
function(predict) {
  # Load the package required to read JSON files.
  library("rjson")
  # Give the input file name to the function.
  result <- fromJSON(file = "input_v3.json")
  print(result)
  result <- as.data.frame(result)
  write.table(result, file="testing_v3_xyz.csv", sep=",", row.names=FALSE, col.names=TRUE, append = T)
}


The curl command i used is curl -F data=@input_v3.json http://xx.xxx.xxx.xx:8000/predict

我需要向它发送一个 IP 地址,即在 aws 上运行的 Desktop 中的 Rstudio

【问题讨论】:

    标签: r json plumber


    【解决方案1】:

    如果您通过--data 发送 JSON,plumber 会透明地解包 JSON:

    library(plumber)
    
    #* parse JSON
    #* @param a  a vector
    #* @param b  a vector
    #* @get /predict
    #* @post /predict
    function(a, b) {
      result <- data.frame(a = as.numeric(a), b = as.numeric(b))
      write.table(result, file="testing_v3_xyz.csv", sep=",",
                  row.names=FALSE, col.names=TRUE, append = T)
    }
    

    在本地运行这个 API 我得到:

    $ cat foo.json 
    { "a":["1","2","3","4","5","6","7","8" ], "b":["1","2","3","4","5","6","7","8" ] }
    $ curl --data @foo.json  http://localhost:8414/predict
    {}
    $ cat ~/learning/stackoverflow/testing_v3_xyz.csv 
    "a","b"
    1,1
    2,2
    3,3
    4,4
    5,5
    6,6
    7,7
    8,8
    

    如果 JSON 的顶层是数组而不是对象,则不能使用命名参数将数据获取到函数中。但是,您可以使用req$postBody 访问发布的内容:

    library(plumber)
    
    #* parse JSON
    #* @param req  the request object
    #* @get /predict
    #* @post /predict
    function(req) {
      result <- as.data.frame(lapply(jsonlite::fromJSON(req$postBody), unlist))
      write.table(result, file="testing_v3_xyz.csv", sep=",", row.names=FALSE, col.names=TRUE, append = T)
    }
    

    对我来说,这适用于这样的示例数据:

    [
      { "a":["1","2","3","4","5","6","7","8" ],
        "b":["1","2","3","4","5","6","7","8" ] },
      { "a":["1","2","3","4","5","6","7","8" ], 
        "b":["1","2","3","4","5","6","7","8" ] }
    ]
    

    【讨论】:

    • { "a":["1","2","3","4","5","6","7","8" ], "b" :["1","2","3","4","5","6","7","8" ] } 就是这个格式
    • @Aditya 好的,我已经更新了我的答案以反映这个数据结构。
    • 嘿,非常感谢!我从你之前的回答中解决了这个问题,这正是我所做的!非常感谢!
    • 还有一件事,如果我有这种格式的数据,{ { "a":"1", "b":"1" }, { "a":"1", " b":"1" } } 我如何让它逐行写入 csv 文件?比如第一个 a,b 在一行中,然后在另一行中?
    • @Aditya 这不是合法的 JSON 结构,因为大括号内的元素必须命名。你的意思是[ { "a":"1", "b":"1" }, { "a":"1", "b":"1" } ]
    猜你喜欢
    • 1970-01-01
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    • 2023-02-05
    相关资源
    最近更新 更多