【问题标题】:Wrapping code in a JSON object在 JSON 对象中包装代码
【发布时间】:2016-03-22 05:39:51
【问题描述】:

我正在尝试将一段代码传递给 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'

对解决此问题有任何帮助吗?

【问题讨论】:

  • 这两个调用中的哪一个导致错误?它的论点究竟是什么?请在此处询问之前提取一个最小示例。无论如何,您似乎在某个时候将 Python 与 ECMAScript 混合在一起,这是两种不同的、不兼容的语言。顺便说一句:您仍在使用非常旧的 Python 版本,请考虑升级。
  • 还有一点:JSON 不是 ECMAScript(或 JavaScript),所以验证器是一个红鲱鱼!

标签: python json rest


【解决方案1】:

无法理解出了什么问题。因为一切看起来都很好,所以下面的代码 sn-p 在 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)

如果可能,请提供有关该错误的更多信息以及重现该错误的更清晰步骤,因此我会更新答案。

【讨论】:

    【解决方案2】:

    您正在尝试解码 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.py 并在命令行中使用python emil.py 运行它。您得到的结果是一个有效的 JSON 对象。

    【讨论】:

    • 我需要使用 json.dumps(data) 的输出作为 requests.post 函数的参数。在这种情况下,我该怎么做?
    猜你喜欢
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    • 2013-02-01
    相关资源
    最近更新 更多