【问题标题】:Python: String indices must be integersPython:字符串索引必须是整数
【发布时间】:2014-12-18 12:01:03
【问题描述】:

我从标准输入得到这个字符串。

{u'trades':[自定义(时间=1418854520,sn=47998,时间戳=1418854517, price=322, amount=0.269664, tid=48106793, type=u'ask', 开始=1418847319,结束=1418847320),自定义(时间=1418854520,sn=47997, 时间戳=1418854517,价格=322,金额=0.1,tid=48106794, 类型=u'ask',开始=1418847319,结束=1418847320), 自定义(时间=1418854520,sn=47996,时间戳=1418854517,价格=321.596, 金额=0.011, tid=48106795, type=u'ask', start=1418847319, 结束=1418847320)]}

当我尝试访问jsonload["trades"] 时,我的程序失败了。如果我使用jsonload[0],我只会收到一个字符:{

我检查了从stdin 获取文本不是问题,但我不知道这是接收格式的问题(因为我使用了 Incursion 库)还是我的 python 中的问题代码。我尝试了很多关于json.load/sjson.dump/s 的组合,但都没有成功。

inputdata = sys.stdin.read()

jsondump = json.dumps(inputdata)

jsonload = json.loads(jsondump)

print jsonload
print type(jsonload) # return me "<type 'unicode'>"
print repr(jsonload) # return me same but with u" ..same string.... "
for row in jsonload["trades"]: # error here: TypeError: string indices must be integers

【问题讨论】:

  • 您的jsonloadstring,而不是dict
  • 试试jsonload = json.loads(inputdata)
  • @jonrsharpe 它返回给我不同的错误“ValueError: Expecting property name: line 1 column 2 (char 1)”但是当运行 json.loads
  • 那么你的inputdata可能不是有效的JSON。
  • @tobias_k 我必须先转换为 dict 吗?

标签: python json influxdb


【解决方案1】:

您将输入数据读入字符串。然后由json.dumps 将其转换为 JSON 编码字符串。然后使用json.loads 将其转回纯字符串。您在任何时候都没有将原始数据解释为 JSON。

尝试只从 json 转换输入数据:

inputdata = sys.stdin.read()
jsonload = json.loads(inputdata)

但是这不起作用,因为您的 sn-p 中没有有效的 JSON 数据。它看起来像序列化的 python 代码。您可以使用http://jsonlint.com检查输入数据

u'trades' 的使用告诉我你有一个 unicode python 字符串。 JSON 等价物是"trades"。要转换python代码你可以eval它,但是如果数据来自不受信任的来源,这是一个危险的操作。

【讨论】:

  • 是的,打印 type(jsonload) # return me "" 。我现在阅读了有关 eval 的信息,但它是一个受信任的环境,因为我从另一个脚本生成了输出,但我更喜欢不使用它。但我不明白为什么 Incursion 库有效但不适合我,我想所以我忘记了中间要做的事情。
  • 在您的原始代码中,实际上只是表明您的字符串是 unicode。你还没有解析你的字符串,所以实际上并没有告诉你任何事情。
  • 那么我需要研究如何解析 unicode,对吗?
  • 不,unicode是一种字符串格式。我建议您需要生成 JSON 数据而不是字符串化 python。
猜你喜欢
  • 1970-01-01
  • 2016-03-26
  • 2016-02-17
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 2019-04-26
  • 2018-10-23
相关资源
最近更新 更多