返回

JSON转换错误:“string indices must be integers, not str”的解决方法

python

JSON 转换错误:从字符串索引到 JSON 对象

问题

在尝试访问 JSON 字符串中的数据时,你可能会遇到一个 TypeError 错误,指出 string indices must be integers, not str。这表明你正尝试使用字符串索引来访问 JSON 对象,而正确的语法应该是使用整数索引。

根本原因

此错误通常是由于将字典直接转换为 JSON 字符串引起的。JSON.dumps() 函数会将字典转换为 JSON 字符串,而不是 JSON 对象。当尝试使用字符串索引访问 JSON 字符串时,由于字符串中的索引必须是整数,访问操作会失败。

解决方案

要解决此问题,你应该:

  1. 使用 json.loads() 将 JSON 字符串转换为 JSON 对象。
  2. 使用整数索引来访问 JSON 对象中的数据。

以下是正确代码示例:

import json

# 将字典转换为 JSON 字符串
r = {'is_claimed': 'True', 'rating': 3.5}
r_json_string = json.dumps(r)

# 将 JSON 字符串转换为 JSON 对象
r_json_object = json.loads(r_json_string)

# 现在,你可以使用整数索引访问数据
print(r_json_object['rating'])

注意事项

  • 确保 JSON 字符串是有效的,没有语法错误。
  • 确保使用正确的键名来访问数据。
  • 对于嵌套对象或数组,你需要使用相应的索引方法进行访问。

结论

了解 JSON 转换中的此常见错误并学会正确解决它对于有效处理 JSON 数据至关重要。通过使用 json.loads() 将 JSON 字符串转换为 JSON 对象,然后使用整数索引来访问数据,你可以避免此错误并高效地管理你的 JSON 数据。

常见问题解答

  1. 我如何知道我的 JSON 字符串是否有效?

    • 你可以使用 json.loads() 来尝试加载字符串。如果它不引发错误,那么字符串就是有效的。
  2. 如何处理嵌套 JSON 对象或数组?

    • 对于嵌套对象,你可以使用点号或方括号表示法来访问它们。对于嵌套数组,你可以使用方括号表示法来访问它们。
  3. 为什么整数索引比字符串索引更好?

    • 整数索引更有效,因为它们直接指向内存中的对象。字符串索引需要搜索字符串,效率较低。
  4. 我能使用其他方法将 JSON 字符串转换为 JSON 对象吗?

    • 除了 json.loads(),你还可以使用 ast.literal_eval() 函数或 eval() 函数。ただし、ast.literal_eval() 不支持嵌套对象,而 eval() 有安全隐患。
  5. 是否有处理 JSON 数据的其他最佳实践?

    • 使用 json.dumps() 时,指定 indent 参数以提高可读性。考虑使用 JSON 库来简化 JSON 数据的处理。