2015-12-16 70 views
1

我想將一段代碼傳遞給包裝在JSON對象中的REST服務器。示例代碼如下所示在JSON對象中包裝代碼

data = { 'code': textwrap.dedent("""\ 
val NUM_SAMPLES = 100000; 
val count = sc.parallelize(1 to NUM_SAMPLES).map { i => 
val x = Math.random(); 
val y = Math.random(); 
if (x*x + y*y < 1) 1 else 0 
}.reduce(_ + _); 
println(\"Pi is roughly \" + 4.0 * count/NUM_SAMPLES) 
""") 
} 

r = requests.post(statements_url, data=json.dumps(data), headers=headers) 

但我收到以下錯誤

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.6/site-packages/requests-2.8.1-py2.6.egg/requests/models.py", line 805, in json 
    return complexjson.loads(self.text, **kwargs) 
    File "/usr/lib64/python2.6/json/__init__.py", line 307, in loads 
    return _default_decoder.decode(s) 
    File "/usr/lib64/python2.6/json/decoder.py", line 319, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "/usr/lib64/python2.6/json/decoder.py", line 338, in raw_decode 
    raise ValueError("No JSON object could be decoded") 
ValueError: No JSON object could be decoded 

我使用JSON驗證檢查JSON數據的有效性,有一個錯誤

Error: Parse error on line 1: 
data = {  'code': t 
^ 
Expecting 'STRING', 'NUMBER', 'NULL', 'TRUE', 'FALSE', '{', '[', got 'undefined' 

任何幫助解決這個問題?

+0

這兩個調用中的哪一個會導致錯誤?它的論點究竟是什麼?請在這裏提問之前抽出一個簡單的例子。無論如何,看起來你在某種程度上將Python與ECMAScript混合使用,這是兩種不同的,不兼容的語言。順便說一句:你仍然在使用一個非常古老的Python版本,請考慮升級。 –

+0

還有一件事:JSON不是ECMAScript(或JavaScript),所以驗證器是一個紅鯡魚! –

回答

0

不明白什麼是錯的。因爲一切看起來都很好,代碼片段如下效果很好Python的2.7:

code = textwrap.dedent("""\ 
val NUM_SAMPLES = 100000; 
val count = sc.parallelize(1 to NUM_SAMPLES).map { i => 
val x = Math.random(); 
val y = Math.random(); 
if (x*x + y*y < 1) 1 else 0 
}.reduce(_ + _); 
println(\"Pi is roughly \" + 4.0 * count/NUM_SAMPLES) 
""") 
data = { 'code': code } 

r = requests.post(statements_url, data=json.dumps(data), headers=headers) 

如果可能提供有關錯誤,更claer步驟重現它的詳細信息,所以我會更新的答案。

0

您正試圖解碼Python文件而不是其輸出。 data =不應該在JSON對象中。它只是創建輸出的Python代碼的一部分。這是JSON對象,你應該嘗試驗證:

嘗試,而不是這個代碼,而不是:

from __future__ import print_function 
import textwrap 
import json 

data = { 'code': textwrap.dedent("""\ 
val NUM_SAMPLES = 100000; 
val count = sc.parallelize(1 to NUM_SAMPLES).map { i => 
val x = Math.random(); 
val y = Math.random(); 
if (x*x + y*y < 1) 1 else 0 
}.reduce(_ + _); 
println(\"Pi is roughly \" + 4.0 * count/NUM_SAMPLES) 
""") 
} 

print(json.dumps(data)) 

保存爲emil.pypython emil.py在命令行中運行它。你得到的結果是一個有效的JSON對象。

+0

我需要使用json.dumps(data)的輸出作爲requests.post函數的參數。在這種情況下,我該怎麼做? – G3M