2017-08-24 60 views
0

我有一個字符串轉換爲json。Python解析字符串替換不工作

的字符串是如下:

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

我使用JSON轉儲和裝載,不工作

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

然後,我需要訪問loadStr [ '主題'],它給我的錯誤「字符串指數必須是整數'

然後我想也許我需要替換"\\" 因此,我做了s.replace('\\\'', '\"'),也沒有工作。

任何想法,我做錯了什麼?順便說一下,我使用python 3.6

+1

's'不是JSON,並且該語句不是有效的Python。請製作一張[mcve]。考慮到你的實際代碼是有效的,'jStr = json.dumps(s)'會產生's'中的字符串值的JSON表示,所以'json.loads(jStr)'將解碼相同的字符串JSON,而不是你之後的字典。 –

回答

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 
+0

好,它的工作原理,非常感謝 – movingcloud

+0

爲什麼不只是'ne = ast.literal_eval(s)'並跳過雙'dumps'? – hpaulj

+0

@hpaulj import json import ast s ='{\'kind \':1,\'topic \':\'manufacturing_device \',\'message_type \':1,\'txid \':\'6bcc6212a8 \ '\ '名\':\ '製造\'}' jStr = json.dumps(S) newtext = EVAL(json.dumps(jStr)) NE = ast.literal_eval(newtext) 打印(類型(ne))。返回類型str –

0

錯誤是因爲loadStr是一個字符串。所以,你不能在字符串上使用getitem

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"}' 
0

如果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'} 
0

如果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解開。

+0

對此建議表示感謝 –