Python解析字符串,替换不起作用

时间:2017-08-24 05:44:38

标签: python json

我有一个要转换为json的字符串。

字符串如下:

s='{\\'kind\\': 1, \\'topic\\': \\'manufacturing_device\\', \\'message_type\\': 1, \\'txid\\': \\'6bcc6212a8\\', \\'name\\': \\'manufacturing\\'}'

我使用json转储和加载,而不是

jStr = json.dumps(s)
loadStr = json.loads(jStr)

然后我需要访问loadStr ['topic'],它给我错误“字符串索引必须是整数'

然后我想也许我需要替换"\\" 因此,我做了s.replace('\\\'', '\"')并且也没有工作。

知道我做错了什么吗?顺便说一下,我使用python 3.6

5 个答案:

答案 0 :(得分:0)

错误是因为loadStr是一个字符串。所以,你不能在字符串上使用getitem

答案 1 :(得分:0)

你只需将json打包成一个字符串,而不是python对象。

那么你试图通过这一行的键获得价值

loadStr = json.loads(jStr)

你会收到这个字符串。

所以我认为你需要这样的东西:

import json
s='{"kind": 1, "topic": "manufacturing_device", "message_type": 1, "txid": "6bcc6212a8", "name": "manufacturing"}'
load_str = json.loads(s)
print(load_str['kind'])

顺便说一句,当你使用python字符串时,使用单引号和双引号更容易,以免转义相同的引号。

s='{"kind": 1, "topic": "manufacturing_device", "message_type": 1, "txid": "6bcc6212a8", "name": "manufacturing"}'

答案 2 :(得分:0)

你可以使用这样的东西

import ast
s='{\'kind\': 1, \'topic\': \'manufacturing_device\', \'message_type\': 1, \'txid\': \'6bcc6212a8\', \'name\': \'manufacturing\'}'

ne = ast.literal_eval(s)
print(type(ne))
print(ne['topic'])

输出

<class 'dict'>
manufacturing_device

答案 3 :(得分:0)

In [1193]: import json

如果s是正确的字典,json可以创建json字符串:

In [1194]: s={'kind': 1, 'topic': 'manufacturing_device', 'message_type': 1, 'txid': '6bcc6212a8', 'name': 'manufacturing'}
In [1195]: s
Out[1195]: 
{'kind': 1,
 'message_type': 1,
 'name': 'manufacturing',
 'topic': 'manufacturing_device',
 'txid': '6bcc6212a8'}

In [1196]: astr = json.dumps(s)
In [1197]: astr
Out[1197]: '{"name": "manufacturing", "txid": "6bcc6212a8", "topic": "manufacturing_device", "message_type": 1, "kind": 1}'

请注意s是字典; astr是一个字符串。

使用loads完成往返:

In [1198]: s1 = json.loads(astr)
In [1199]: s1
Out[1199]: 
{'kind': 1,
 'message_type': 1,
 'name': 'manufacturing',
 'topic': 'manufacturing_device',
 'txid': '6bcc6212a8'}

答案 4 :(得分:0)

In [1193]: import json

如果s是正确的字典,json可以创建json字符串:

In [1194]: s={'kind': 1, 'topic': 'manufacturing_device', 'message_type': 1, 'txid': '6bcc6212a8', 'name': 'manufacturing'}
In [1195]: s
Out[1195]: 
{'kind': 1,
 'message_type': 1,
 'name': 'manufacturing',
 'topic': 'manufacturing_device',
 'txid': '6bcc6212a8'}

In [1196]: astr = json.dumps(s)
In [1197]: astr
Out[1197]: '{"name": "manufacturing", "txid": "6bcc6212a8", "topic": "manufacturing_device", "message_type": 1, "kind": 1}'

请注意s是字典; astr是一个字符串。

使用loads完成往返:

In [1198]: s1 = json.loads(astr)
In [1199]: s1
Out[1199]: 
{'kind': 1,
 'message_type': 1,
 'name': 'manufacturing',
 'topic': 'manufacturing_device',
 'txid': '6bcc6212a8'}

访问字典的元素只是标准的Python:

In [1205]: s1['topic']
Out[1205]: 'manufacturing_device'

(编辑与我对已接受答案的评论相关)

此表达式创建一个字符串:

In [1214]: s='{\'kind\': 1, \'topic\': \'manufacturing_device\', \'message_type\': 1, \'txid\': \'6bcc6212a8\', \'name\': \'manufacturing\'}'
In [1215]: s
Out[1215]: "{'kind': 1, 'topic': 'manufacturing_device', 'message_type': 1, 'txid': '6bcc6212a8', 'name': 'manufacturing'}"

它是一个有效的Python表达式,literal_eval可以评估,并创建一个字典:

In [1216]: ne = ast.literal_eval(s)
In [1217]: ne
Out[1217]: 
{'kind': 1,
 'message_type': 1,
 'name': 'manufacturing',
 'topic': 'manufacturing_device',
 'txid': '6bcc6212a8'}

无需将其包含在一个或多个json.dumps中,然后使用loadseval解包。