2016-01-25 110 views
1

我是R的初學者(仍然在Coursera上進行「R編程」課程),我試圖練習R將一些簡單的代碼從Python移植到R.R中的Python「json.dumps()」的等價物?

當前我試圖請致電KairosDB database進行API調用。爲了進行查詢,我需要使用json.dumps()(來自json本機庫)對Python對象進行編碼,但是我已經搜索了很多,但我沒有得到如何使用R和它的jsonlite庫。我甚至不知道我是否正確創建了JSON對象,但這是我在某些搜索中找到的。

我編寫的代碼在Python 3(from this repo):

寫R中3.2.3
import requests 
import json 

kairosdb_server = "http://localhost:8080" 

# Simple test 
query = { 
    "start_relative": { 
     "value": "4", 
     "unit": "years" 
    }, 
    "metrics": [ 
     { 
      "name": "test", 
      "limit": 10000 
     } 
    ] 
} 
response = requests.post(kairosdb_server + "/api/v1/datapoints/query", data=json.dumps(query)) 
print("Status code: %d" % response.status_code) 
print("JSON response:") 
print(response.json()) 

我當前的代碼:

library(httr) 
library(jsonlite) 

kairosdb_server <- 'http://localhost:8080' 

query <- serializeJSON(toJSON(' 
    "start_relative": { 
    "value": "4", 
    "unit": "years" 
    }, 
    "metrics": [ 
    { 
     "name": "test", 
     "limit": 1000 
    } 
    ] 
')) 

url <- paste(kairosdb_server, '/api/v1/datapoints/query') 
response <- POST(url, body = query, encode = 'json') 

print(paste("Query status code: ", response$status_code)) 
print(paste("JSON response: \n", content(response, type = 'application/json'))) 

如果我跑,我得到了以下錯誤:

我在做什麼錯了?

+0

你能告訴我們你得到的Python調用'json.dumps(query)'和R調用'serializeJSON(toJSON('...'))'嗎?當我嘗試Python調用時,我得到'{「metrics」:[{「limit」:10000,「name」:「test」}],「start_relative」:{「unit」:「years」,「value」 :「4」}}''。 R電話給我一些更復雜的東西。如果我將'query'設置爲R'list',然後調用'toJSON(query,auto_unbox = TRUE)',我確實會得到類似於Python輸出的東西。最後一位解包1個元素的向量。 – Dthal

回答

2

通常,人們會將名爲list的文件傳遞到body,但試圖讓R保留「度量」中的數組非常棘手。既然你已經有了原始Python結構的JSON,爲什麼不加入括號並作爲字符向量傳遞呢?即

query <- '{"start_relative": { 
    "value": "4", 
    "unit": "years" 
    }, 
    "metrics": [ 
    { 
     "name": "test", 
     "limit": 10000 
    } 
    ]}' 

(然後只使用在該POSTquery)。這相當於JSON什麼json.dumps()吐出:

# get rid of newlines and spaces just to show they are the same, 
# the server won't (shouldn't) care if there are newlines/spaces 
cat(gsub(" \\]", "]", gsub("\\[ ", "[", gsub(" \\}", "}", gsub("\\{ ", "{", gsub("\ +", " ", gsub("\\n", "", query))))))) 
{"start_relative": {"value": "4", "unit": "years"}, "metrics": [{"name": "test", "limit": 10000}]} 

# python 
json.dumps(query) 
'{"metrics": [{"limit": 10000, "name": "test"}], "start_relative": {"unit": "years", "value": "4"}}' 

如果你確實需要一個R數據結構,你會最終操縱的toJSON輸出工作。

+0

謝謝,這種方法對我有用! :) – Paladini