【问题标题】:Python Array JSON (dumps)Python 数组 JSON(转储)
【发布时间】:2026-01-12 09:15:01
【问题描述】:

谷歌应用引擎,Python27

我正在尝试将 python 字符串数组编码为 JSON 字符串以发送到客户端。我创建了一个可行的解决方案,这需要我手动创建数组的字符串版本并从 python 调用转储,但我认为没有必要:

def get_json(cls):
  name_query = cls.query()
  array_string = "["
  index = 1
  for name in name_query:
      array_string += '"' + name.key.id() + '"'
      if index < name_query.count():
          array_string += ", "
      index += 1
  array_string += "]"
  return json.dumps(array_string)

>> "[\"Billy\", \"Bob\"]"

对于我的第二次尝试,我尝试在 python 数组上调用“转储”,我认为这应该是一个可行的解决方案;相反,我必须调用转储两次:

# (bad output)
def get_json(cls):
  name_query = cls.query()
  name_array = []        
  for name in name_query:
      name_array.append(name.key.id())
  return json.dumps(name_array)

  >> ["Billy", "Bob"]

# (working output)
def get_json(cls):
  name_query = cls.query()
  name_array = []        
  for name in name_query:
      name_array.append(name.key.id())
  return json.dumps(json.dumps(name_array)))

  >> "[\"Billy\", \"Bob\"]"

即使我有一个可行的解决方案,有没有更好的方法,为什么在 python 数组上调用转储没有给出正确的输出?

【问题讨论】:

    标签: arrays json google-app-engine python-2.7


    【解决方案1】:

    第一个功能运行良好;它正在输出一个有效的 JSON 字符串。我认为您的困惑在于它没有被双引号括起来,但这只是因为您是 printing 函数的输出。

    它返回一个包含 JSON 列表的字符串,而不是 Python list 对象:

    >>> def get_json():
    ...  x = ["Billy", "Bob"]
    ...  return json.dumps(x)
    ... 
    >>> print get_json()
    ["Billy", "Bob"]
    >>> print repr(get_json())
    '["Billy", "Bob"]'  # It's a string, not a list
    >>> type(get_json())
    <type 'str'>  # See? Type is str
    

    当您调用 json.dumps 两次时,您只是将第一个 json.dumps 调用返回的 Python 字符串包装在双引号中,并且数组内的双引号被转义,因为它们是嵌入的现在在一个大的 JSON 字符串中,而不是在 JSON 数组中用作 JSON 字符串的引号。

    >>> print repr(json.dumps(get_json()))
    '"[\\"Billy\\", \\"Bob\\"]"'
    

    【讨论】:

    • 我不断收到错误消息,除非数组中的引号被转义并且 repr 不会为我转义引号。
    • @user3707451 你得到什么错误?将完整的 Traceback/调用代码编辑到您的问题中。此外,repr 并不是要转义引号,它只是向您显示对象的可打印表示。我用它来说明你得到的是str,而不是list
    • json.dumps 转义了我生成的字符串上的引号,或者如果我使用调用在 python 数组上转储两次。我认为必须对引号进行转义才能使其成为有效的 json。如果我通过将内容类型设置为“application/json”将响应 json.dumps(name_array) 写为 json,我没有从 ajax 得到任何输出或超时错误